【发布时间】:2016-06-05 22:18:09
【问题描述】:
我正在尝试了解如何创建 monad 的规则。据我了解,这取决于我要使用的数据类型以及 monad 必须满足三个定律:
1. m >>= return = m
2. return x >>= f = f x
3. (m >>= f) >>= g = m >>= (\x-> f x) >>= g
好的。所以对于一个单子Maybe 我有最后两行。第三行中的“x”代表什么。如果应该是一个函数,它不应该吗?
data Maybe a = Nothing | Just a
instance Monad Maybe where
(Just x) >>= f = f x
Nothing >>= _ = Nothing
_ >>= x = x
fail _ = Nothing
(我现在无法找到这个定义的来源,但我在某个地方找到了它)
我也找到了另一个版本 - 为什么我需要带有“失败”的行?
data Maybe a = Nothing | Just a
instance Monad Maube where
return x = Just x
Just x >>= f = f x
Nothing >>= f = Nothing
fail _ = Nothing
【问题讨论】:
-
您能否提供这些定义的来源?
-
_ >>= x = x是错误的。>>=具有m a -> (a -> m b) -> m b类型,因此该定义忽略了m a值(我们知道它是Just,但在这里无关紧要),并尝试返回a -> m b值,就好像它是m b. -
确实如此。 究竟在哪里你在
_ >>= x = x中找到了这个定义?至少它既不在 LYAH 的在线版本中,也不在我的印刷版中。而且,不应该是错误的。 -
@chepner 我认为这并不重要。那行代码只是死代码,永远无法访问。
-
@Sibi 还是要进行类型检查,否则编译器会拒绝。
标签: haskell