Vik*_*ahl 6 monads haskell either
我有两个值,t1并且t2,类型的Either String Type.该Left-value用于错误处理.这些值用于返回的函数中Either String Type.
我想要做的是检查是否都t1和t2都Right-值和满足p :: Type -> Bool.如果他们这样做,我想回来Right (the type inside t1).如果这两个t1和t2是Right-值,但不能满足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)
如果你确实希望这样做,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)