Haskell的要么v。错误

时间:2014-08-24 14:18:59

标签: haskell

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就是一个Eithera类型的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,反之亦然?

1 个答案:

答案 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}}则排除了该要求。