2010-09-21 9 views
6

Sto cercando di imparare Haskell scrivendo piccoli programmi ... quindi sto attualmente scrivendo un lexer/parser per espressioni semplici. (Sì, potrei usare Alex/Happy ... ma prima voglio imparare la lingua principale).Qual è l'alternativa alle eccezioni in una profonda ricorsione di Haskell?

Il mio parser è essenzialmente un insieme di funzioni ricorsive che costruiscono un albero. Nel caso di errori di sintassi, normalmente lancerei un'eccezione (ad esempio se scrivessi in C#), ma ciò sembra scoraggiarsi in Haskell.

Quindi qual è l'alternativa? Non voglio davvero testare gli stati di errore in ogni singolo bit del parser. Voglio finire con un albero di nodi valido o uno stato di errore con dettagli.

risposta

5

Per un calcolo che potrebbe non riuscire con i dettagli sul perché non funziona, c'è il tipo Either a b, ad es. Either ErrorDetails ParseTree, quindi il tuo risultato potrebbe essere Right theParseTree o Left ErrorDetails. Puoi associare pattern a questi costruttori nella tua funzione ricorsiva e se c'è un errore, lo passi; altrimenti continui come al solito.

+5

I programmi più grandi di Haskell nascondono questi dettagli facendo "istanza Monad (Either ErrorDetails) dove ..." in modo da non dover gestire esplicitamente il caso di errore in ciascuna funzione. –

+0

@TomMD: Sì, ma non suggerisci "rendi tua la monade" a un nuovo discente;) – delnan

+0

Beh, finché sa che sta solo imparando/utilizzando un quarto di Haskell ignorando monadi e trasformatori. Altrimenti avrà la falsa impressione che Haskell sia eccessivamente prolisso. –

9

Haskell fornisce i tipi Maybe e Either per questo. Dal momento che si desidera restituire uno stato di errore, sembra essere quello che si desidera.

Problemi correlati