resumen resueltos respuestas kuby johnson jhonson estadística estadisticos estadistica enunciados elemental ejercicios scala haskell lens lenses monocle-scala

scala - resueltos - Lente/Prisma con manejo de errores.



estadística elemental johnson r (1)

Recientemente he escrito una entrada de blog sobre óptica indexada; que explora un poco cómo podemos hacer también ópticas indexadas.

En resumen: las ópticas coindexadas son posibles, pero todavía tenemos que hacer más investigaciones allí. Especialmente, porque si intentamos traducir ese enfoque en lens codificación de lentes de lentes (desde Profunctor a VL), se vuelve aún más peludo (pero creo que podemos salirse con solo 7 variables de tipo).

Y realmente no podemos hacer esto sin alterar cómo se codifican actualmente las ópticas indexadas en la lens . Así que por ahora, es mejor usar bibliotecas específicas de validación.

Para dar una pista de las dificultades: Cuando intentamos componer con Traversal s, deberíamos tener

-- like `over` but also return an errors for elements not matched validatedOver :: CoindexedOptic'' s a -> (a -> a) -> s -> (ValidationErrors, s)

¿o algo mas? Si solo pudiéramos componer Prismas Coindexados, su valor no justificará su complejidad; no "encajarán" en el marco óptico.

Digamos que tengo un par de funciones de conversión

string2int :: String -> Maybe Int int2string :: Int -> String

Podría representar estos bastante fácilmente utilizando la óptica.

stringIntPrism :: Prism String Int

Sin embargo, si quiero representar el motivo del fallo, necesitaría mantener estas funciones como dos funciones separadas.

string2int :: String -> Validation [ParseError] Int int2string :: Int -> String`

Para este simple ejemplo, Maybe esté perfectamente bien, ya que siempre podemos suponer que una falla es una falla de análisis, por lo que no tenemos que codificar esto usando un tipo de Validación o de Either.

Sin embargo, imagínese, además de mi Prisma de análisis, quiero realizar una validación

isOver18 :: Int -> Validation [AgeError] Int isUnder55 :: Int -> Validation [AgeError] Int

Sería ideal poder componer estas cosas juntas, de manera que yo pudiera

ageField = isUnder55 . isOver18 . string2Int :: ValidationPrism [e] String Int

Esto es bastante trivial de construir a mano, sin embargo, parece ser un concepto lo suficientemente común como para que haya algo al acecho en el campo de Lentes / Óptica que ya lo haga. ¿Hay una abstracción existente que maneja esto?

tl; dr

¿Existe una manera estándar de implementar una lente / prisma / iso parcial que se pueda parametrizar sobre un funtor arbitrario en lugar de estar vinculado directamente a Maybe?

He usado la notación Haskell anterior porque es más sencillo, sin embargo, en realidad estoy usando Monocle en Scala para implementar esto. Sin embargo, estaría perfectamente feliz con una respuesta específica para, por ejemplo, la biblioteca de lentes de ekmett.