data Error a = OK a | Error String
instance Monad Error where
return = OK
在这种情况下我应该如何定义bind?
>>= : Error a -> (a->error b) -> error b
这是本案例函数绑定的类型,我希望它是正确的。
OK a >>= f = (don't know where to begin need some help)
Error err >>=f = (in this case can i just return error like = Error err)
我还想知道是否有人可以解释为什么这些seq的使用存在问题。 您可以在幻灯片(页面)10上找到它们 seq的用法 http://fileadmin.cs.lth.se/cs/Education/EDAN40/lectures/Parallelism.pdf hittendInside xy = someFunc(x'seq'y)为什么这个有问题的forexamble是因为seq不会返回x它只会评估它并且只会返回y。 在其他两个考试中也是如此吗?
答案 0 :(得分:9)
想想你希望如何使用一系列功能
---->f---->g---->h---->
| | |
V V V
Err Err Err
如果没有发生错误,数据应该是直接拍摄
OK x---->remove OK---->f---->remove OK---->g---->remove OK---->h---->
这可以通过
来实现OK x >>= f = f x
如果您在任何时候遇到错误,计算应该停止
OK x---->remove OK---->f---->Error (Stop!)
这可以通过
来实现Error message >>= f = Error message
顺便说一下,你不必写这个,它已经存在,名称为“Either”
data Either a b = Left a | Right b
monad被设置为“Right”传递数据(得到 - “Right”表示“正确”),Left停止数据(即 - “错误”)。如果您不想要消息,请使用“可能”。
请注意,这与Java中的异常非常相似。
答案 1 :(得分:1)
对于OK
案例,您有一个a
和一个函数(a -> Error b)
,需要返回Error b
类型的值。您只需将函数f
应用于a
的值OK
:
OK a >>= f = f a
Error err >>= f = Error err