【发布时间】:2016-05-01 19:04:54
【问题描述】:
下面是来自another stack overflow question 答案的一些代码。我开始学习 Haskell 已经有几个星期了,但我还没有遇到这种特殊的语法,我在任何地方都找不到解释,甚至找不到它的定义。 所以,代码:
data Pair a = P a a
instance Functor Pair where
fmap f (P x y) = P (f x) (f y)
instance Monad Pair where
return x = P x x
P a b >>= f = P x y
where P x _ = f a
P _ y = f b
我花了最后半个小时试图理解它的含义,或者我已经知道的东西解释了这个绑定(>>=)方法的定义。 GHCI 毫不费力地加载了它(它需要一个 Applicative 实例,但除此之外),所以它必须是非常允许的,即使我还没有理解它的开头。
通过模式匹配已经定义的数据构造函数的定义是什么意思? x 和 y 是什么,它们从何而来?
感谢任何回答这个问题的人。如果有人对这个问题有一个好的、具体的标题有一个好主意——考虑到我真的不明白它的语法含义,我很难找到一个。
@leftaroundabout 给了我我需要的信息,就是那段代码
P x y
where P x _ = f a
P _ y = f b
是一种“值拆箱”类型的模式匹配形式,而不是case of 式的面向选择的模式。我对_ 模式的存在感到困惑,因此我没有看到上述两个模式匹配,即x 然后y 的定义,因为它是在一种我以前从未见过的方式。
我知道我们可以这样写:
f :: foo -> (Int, Int)
...
i = let (a,b) = f x
in a + b
但我不知道我们可以在这些“价值拆箱”的情况下使用(例如,这里是 a 和 b,或者在困扰我的代码中的 x 和 y),模式匹配的全部可能性,也就是说,至少,定义使用_ 来隔离我们不想要的部分,我们不想绑定到任何“标签”的值。
总之我不知道在上面的例子中,这个等式
P x _ = f a
实际上是x对(f a)的结果进行模式匹配的定义,因此在效果上严格等价于
x = g (f a)
where g (P t _) = t
我一直认为这是已经定义的数据构造函数P的定义。
【问题讨论】:
标签: haskell pattern-matching bind monads