2010-09-21 13 views
6

Estoy tratando de aprender Haskell escribiendo pequeños programas ... así que actualmente estoy escribiendo un analizador/analizador para expresiones simples. (Sí, podría usar Alex/Happy ... pero primero quiero aprender el lenguaje central).¿Cuál es la alternativa a las excepciones en una recursividad profunda de Haskell?

Mi programa de análisis es esencialmente un conjunto de funciones recursivas que construir un árbol. En el caso de los errores de sintaxis, normalmente lanzaría una excepción (es decir, si estuviera escribiendo en C#), pero eso parece desanimado en Haskell.

Entonces, ¿cuál es la alternativa? Realmente no quiero probar los estados de error en cada bit del analizador. Quiero terminar con un árbol de nodos válido o un estado de error con detalles.

Respuesta

5

Para un cálculo que podrían fallar con detalles sobre por qué failes, está el tipo Either a b, por ejemplo, Either ErrorDetails ParseTree, por lo que su resultado podría ser Right theParseTree o Left ErrorDetails. Puedes hacer coincidir patrones con estos constructores en tu función recursiva y si hay un error, lo pasas; de lo contrario, continúa como de costumbre.

+5

más grande programas Haskell ocultar estos detalles haciendo instancia de 'Mónada (O ErrorDetails), donde ...' por lo que no tiene que manejar de forma explícita en el caso de error cada función. –

+0

@TomMD: Sí, pero no sugieren "hace es el propietario mónada" a un alumno nuevo;) – delnan

+0

bien siempre y cuando él sabe que sólo está aprendiendo/usando una cuarta parte de Haskell haciendo caso omiso de las mónadas y transformadores. De lo contrario, tendrá la falsa impresión de que Haskell es excesivamente detallado. –

9

Haskell proporciona los Maybe y Either tipos para esto. Dado que desea devolver un estado de error, Either parece ser lo que desea.

Cuestiones relacionadas