gpt4 book ai didi

haskell - 如何在 Haskell 中对中间值进行模式匹配

转载 作者:行者123 更新时间:2023-12-02 10:01:15 25 4
gpt4 key购买 nike

问题

Bartosz Milewski 所著的《程序员的类别理论》一书,第 4.3 章。

您必须编写一个 Kleisli 类别,其中态射是偏函数。这是我的尝试,但无法编译:

data Optional a = Valid a | Invalid deriving (Show)

return :: a -> Optional a
return x = Valid x

(>=>) :: (a -> Optional b) -> (b -> Optional c) -> (a -> Optional c)
f (>=>) g = \x ->
let s = f x
in | s == Valid v = g v
| s == Invalid = Invalid

>=> 运算符定义中,我想对中间值 s 进行模式匹配以测试是否有效(然后调用f)或者如果它是Invalid(然后返回Invalid)。我怎样才能做到这一点?

最佳答案

您可以使用case进行模式匹配:

f >=> g = \x ->
case f x of
Valid v -> g v
Invalid -> Invalid

在您的问题中,您似乎还尝试使用守卫来进行模式匹配和绑定(bind)值。 Haskell 不允许这样做。防护只是一个 bool 值表达式,它必须为 true 才能匹配前面的(有时是可选的)模式。 Haskell 语言并没有真正将 (==) 运算符“理解”为相等的意思。它只是将其视为与其他函数一样的函数。事实上,我们可以将其定义为一种不对应于模式匹配所需的同类相等性的类型。

守卫可以使用模式(或更大范围)中的变量,但不能像模式一样绑定(bind)新变量。因此这是错误的,因为 v 是未定义的。

f >=> g = \x ->
case f x of
_ | x == Valid v -> g v
_ | x == Invalid -> Invalid

这也使得编译器基本上不可能知道你的模式是否详尽(即没有任何值在任何情况下都不匹配)

关于haskell - 如何在 Haskell 中对中间值进行模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59226842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com