Quiero escribir una función saveStuff
que guarda algo en un archivo, después de que pasa ciertas pruebas. Si las pruebas fallan, necesito generar un error. ¿Cuál debería ser el tipo de resultado de esta función? Pensé en IO (Either String())
y IO (Maybe String)
, pero ambos de ellos se sienten mal por algún motivo. Busqué funciones similares de la biblioteca estándar, pero simplemente parecen devolver IO()
. Lanzan excepciones en los fracasos. No puedo encontrar que me guste ese enfoque.¿Cuál debería ser el tipo de resultado de esta función?
Respuesta
Se puede que no hacer algo que devuelve un ErrorT String IO()
. La documentación para el transformador de mónada ErrorT
es on Hackage. Hay más sugerencias en el excelente Eight Ways to Report Errors por Eric Kidd y el follow up algunos años después por Edward Yang.
'ErrorT' es en lo que pensé, también. Usted tiene lo que es esencialmente un 'IO()', y desea agregar el potencial de un error con un mensaje, así que simplemente golpee el transformador 'ErrorT' encima de él. –
Si solo hay una forma en que saveStuff
puede tener éxito, un tipo isomorfo a Maybe ErrorMessage
es del tipo correcto. Maybe ErrorMessage
tiene la desventaja de que generalmente Nothing
denota un error cuando se usa Maybe
, por lo que sería contrario a las expectativas aquí. Con respecto a eso, Either ErrorMessage()
es mejor, pero el parámetro ()
para el caso Right
no contiene ninguna información, por lo tanto, esa opción también carece de elegancia.
Si no desea aceptar estas deficiencias, definir su propio tipo de resultado
data Result = Success | Failure ErrorMessage
-- with type ErrorMessage = String, for example
- 1. ¿Cuál debería ser el tipo de iterador en esta plantilla de C++?
- 2. Java: ¿Cómo escribir una función `zip`? ¿Cuál debería ser el tipo de devolución?
- 3. WCF ¿cuál debería ser el EndpointConfigurationName?
- 4. ¿Cuál es el tipo en esta plantilla?
- 5. ¿Cuál debería ser mi LESS @import path?
- 6. memcpy(), ¿cuál debería ser el valor del parámetro de tamaño?
- 7. ¿Debería almacenarse el resultado getSystemService (...)?
- 8. ¿Cuál debería ser el estándar para las URL ReSTful?
- 9. Confundir ¿Cuál debería ser mi Expresión Xpath?
- 10. ¿Debería el resultado de sRGB-> CIEXYZ-> descartar luminancia ser convertible de nuevo a sRGB?
- 11. ¿Por qué esta función javascript se ejecuta sin ser llamada?
- 12. ¿Debería el patrón de estrategia ser apátrida?
- 13. ¿cuál debería ser la salida de un lexer en c?
- 14. F #: Esta expresión debería tener el tipo 'unidad', pero tiene el tipo 'ConsoleKeyInfo'
- 15. ¿Qué debería ser hadoop.tmp.dir?
- 16. ¿Cuál debería ser la técnica de umbralización ideal para mejorar partes de la imagen?
- 17. ¿Por qué es el tipo de esta función (a -> a) -> a?
- 18. TryParse() - ¿Por qué este código devuelve 0, no debería el resultado ser -1?
- 19. SELECCIONE DISTINCT implica algún tipo de resultado
- 20. ¿Qué tipo de métodos debería ser el método de la clase modelo?
- 21. ¿Cuál es el significado de esta sintaxis?
- 22. ¿Cuál debería ser el valor predeterminado en un parámetro opcional DateTime?
- 23. ¿Cuál es la ventaja de esta llamada de función indirecta?
- 24. ¿Cuál debería ser el tiempo de vida de una sesión de NHibernate?
- 25. ¿Debería ser el caso base de código abierto?
- 26. ¿Qué funcionalidad debería ser siempre de terceros?
- 27. ¿Debería el mailto ser utilizado en HTML5?
- 28. ¿Cuán extensible debería ser realmente el código?
- 29. ¿Cuál debería ser el tamaño de (int) en una máquina de 64 bits?
- 30. Viniendo de Python, ¿cuál debería ser el segundo lenguaje de programación para aprender?
Si puede tener éxito de una sola manera, 'Maybe ErrorMessage' o algo isomorfo es el tipo correcto. Si no le gusta 'Maybe' porque usualmente' Nothing' indica falla, use 'data Result = Success | Fallo de cadena'. –
@DanielFischer: Probablemente sea una buena respuesta (en lugar de un comentario). –