¿Cómo verificar si todo el elemento en la lista de un tipo algebraico en Haskell?
functional-programming haskell-platform (2)
Si tengo el siguiente tipo de datos algebraicos
type MyVal = Either String Int
y tiene una lista que contiene elementos de tipo MyVal
ls = [Right 1, Right 2, Right 3]
xs = [Right 1, Left "error", Right 3]
ahora, quiero escribir la función para descubrir que mi lista tiene todo el valor de ''Correcto'', entonces debería devolver Verdadero, de lo contrario, Falso.
En el caso de
ls
devolverá True y para
xs
devolverá False.
¿Cómo puedo hacer eso?
He intentado usar
all
funciones pero no pude usarlo correctamente.
No en contra de
all isRight
como una buena respuesta a la pregunta que se hizo, cuestionaría la pregunta, hasta cierto punto.
¿De qué sirve calcular, como
Bool
, si todos los valores de
Either
en una lista son
Right
?
¿Qué te permite hacer?
Una respuesta es que le da derecho a eliminar las etiquetas
Right
de la lista completa, tratando el conjunto como libre de errores.
Una opción más informativa podría ser construir algo de tipo
[Either String Int] -> Either String [Int]
para que, en lugar de un mero
True
o
False
, obtenga todos los
Int
sin etiquetar o el mensaje asociado con la primera
Left
molesta.
Y hay una función estándar que hace esto (y muchas otras cosas además).
Explota el hecho de que las listas son una estructura de datos con un patrón transversal estándar y que
Either String
codifica una noción de cálculo de gestión de errores con patrones estándar de falla y propagación exitosa.
El tipo ya ha hecho el trabajo duro.
Todo lo que necesitas decir es ...
sequenceA
Puede hacer uso de la función
isRight :: Either ab -> Bool
para verificar si un valor de
Either ab
es un
Right x
.
Entonces puede implementar esto con:
import Data.Either(isRight)
allRight :: Foldable f => f (Either a b) -> Bool
allRight = all isRight
Esto nos da el resultado esperado:
Prelude Data.Either> allRight ls
True
Prelude Data.Either> allRight xs
False