Learn You a Haskell出示Error
:
instance (Error e) => Monad (Either e) where
return x = Right x
Right x >>= f = f x
Left err >>= f = Left err
fail msg = Left (strMsg msg)
Hackage出示Either
:
data Either a b = Left a | Right b
如果我理解正确,那么Error
就是一个Either
为a
类型的Monad。此外,它似乎还有fail
来处理异常。
但是,我也看到Control.Monad.Either
也是http://hackage.haskell.org/package/category-extras-0.53.4/docs/Control-Monad-Either.html。
为什么Control.Monad.Error
选择Control.Monad.Either
,反之亦然?
答案 0 :(得分:11)
不,Error
不是monad。 Either e
是monad,Error e
是Monad
Either e
Error e
实例存在的类型类先决条件。基本上e
表示strMsg
是一种类型,您可以将错误消息转换为Either e
,其中 用于fail
&#39}。 s Error e
方法。
然而,人们发现这个要求只有一个Either e
实例才能使用instance Monad (Either e) where
return = Right
Left l >>= _ = Left l
Right r >>= k = k r
作为monad烦人,所以在写完LYAH后实际上已删除 。现在实例只是
fail
和Monad
使用fail s = error s
类定义中的默认值:
Error e
然而,Control.Monad.Error
要求仍然是{至少是最新的Haskell平台的要求} Control.Monad.Either
中定义的monad和变换器所需要的,而{{1}}则排除了该要求。