2012-05-04 15 views
5

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?

+7

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'. –

+2

@DanielFischer: Probablemente sea una buena respuesta (en lugar de un comentario). –

Respuesta

7

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.

+0

'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. –

6

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 
Cuestiones relacionadas