Haskell的要么v.错误

Kev*_*ith 7 haskell

了解一个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) 
Run Code Online (Sandbox Code Playgroud)

Hackage礼物Either:

data Either a b = Left a | Right b
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,那么ErrorMonad Either就是它的a类型.此外,它看起来像是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,反之亦然?

Ørj*_*sen 11

不,Error不是一个单子.Either e是一个monad,并且Error e Monad实例Either e存在的类型类先决条件.基本上Error e意味着e是一项可以通过错误消息转换成与一种类型strMsg,它用于Either efail方法.

然而,人们发现这个要求有一个Error e实例只是为了能够Either e用作monad烦人,所以在LYAH写完之后它实际上被删除了.现在这个例子就是

instance Monad (Either e) where
    return = Right
    Left  l >>= _ = Left l
    Right r >>= k = k r
Run Code Online (Sandbox Code Playgroud)

fail而是使用从默认的Monad类定义:

fail s      = error s
Run Code Online (Sandbox Code Playgroud)

但是,Error e对于定义的monad和变换器的要求仍然是(至少从最新的Haskell平台开始)Control.Monad.Error,而Control.Monad.Either忽略了该要求.