如何定义错误monad

时间:2013-12-14 11:25:13

标签: haskell

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。 在其他两个考试中也是如此吗?

2 个答案:

答案 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