了解一个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 e的fail方法.
然而,人们发现这个要求有一个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忽略了该要求.
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |