在Haskell中使用'Either'

Vik*_*ahl 6 monads haskell either

我有两个值,t1并且t2,类型的Either String Type.该Left-value用于错误处理.这些值用于返回的函数中Either String Type.

我想要做的是检查是否都t1t2Right-值和满足p :: Type -> Bool.如果他们这样做,我想回来Right (the type inside t1).如果这两个t1t2Right-值,但不能满足p,我要回Left someString.如果其中一个t1或是t2一个Left值,我只想传递该值.

我怎样才能以优雅的方式做到这一点?我有一种预感,使用Either作为monad是正确的做法,但我不确定如何去做.

Lan*_*dei 10

为什么是monads?

test p (Right t1) (Right t2) | p t1 && p t2 = Right t1
                             | otherwise = Left "nope"
test _ (Left t1) _ = Left t1
test _ _ (Left t2) = Left t2
Run Code Online (Sandbox Code Playgroud)


GS *_*ica 5

如果你确实希望这样做,Monad它会看起来像这样,但最近更改了Monad实例,Either以便在最近的GHC中实际上不起作用:

do v1 <- t1
   v2 <- t2
   guard (p v1 && p v2) `mplus` Left someString
   return v1
Run Code Online (Sandbox Code Playgroud)

  • 您能否提供有关变更的更多详细信息,特别是变更的内容和时间? (2认同)
  • @mightybyte:我们将`Either`的实例从`transformers`(以及之前的`mtl`)移动到`base`,但是因为实例涉及一个类_and_来自Prelude的类型并且没有任何当前的声明Haskell标准,我们必须从`Control.Monad.Instances`导出它,而不是只是把它放到任何地方.在这个过程中,我们从左手参数中删除了"错误"的假设为"Either".这有一个副作用,即改变`fail`的行为,从'Left.strMsg`到`error`.我们在`变形金刚'中留下了'MonadPlus`和`Alternative`. (2认同)