Esta função retornará um Either
tipo. A String representa o valor de erro, e o Right/Bool representa o tipo booleano normal que o usuário se importa
testPre :: Rational -> Rational -> Either String Bool
testPre a b
| b == 0 = Left "Shouldn't be 0"
| a > b = Right True
| a <= b = Right False
Mas e se eu quisesse testar uma lista de números com um any
or especial all
que funciona com Either String Bool ? Make any
or all
funciona no contexto de Either
?
all (testPre 3) [1,2] => should be `Right True`
all (testPre 3) [1,2,3] => should be `Right False`
any (testPre 3) [1,5] => should be `Right True`
any (testPre 3) [5,6] => should be `Right False`
any (testPre 3) [1,0,3] => should be "Shouldn't be 0"
Obrigado
Em vez de
all
eany
, você pode usarand
eor
em combinação comtraverse
.(Embora não seja definido dessa forma
all
eany
possa ser visto apenas como combinações deand
eor
comfmap
:Estamos apenas substituindo
fmap
portraverse
e mapeandoand
/or
sobre o resultado em vez de aplicá-los ao resultado.)