haskell functional-programming haskell-platform

¿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