Perché avere un costruttore wrapper quando si memorizza una funzione in un tipo di dati?

7

Non posso mai fare troppi tutorial Haskell. C'è sempre qualcosa da perfezionare e imparare. Quindi, sto lavorando al capitolo 10 di Real World Haskell , e tutto ha un senso.

ma

Perché

newtype Parse a = Parse { runParse :: ParseState -> Either String (a, ParseState) }

identity :: a -> Parse a
identity a = Parse (\s -> Right (a, s))

getState :: Parse ParseState
getState = Parse (\s -> Right (s, s))

putState :: Parse ()
putState = Parse (\s -> Right ((), s))

Perché non fare semplicemente

type Parse a = ParseState -> Either String (a, ParseState)

identity :: a -> Parse a
identity a = \s -> Right (a, s)

getState :: Parse ParseState
getState = \s -> Right (s, s)

putState :: Parse ()
putState = \s -> Right ((), s)

In altre parole, qual è lo scopo del pattern wrap e unwrap qui (che vedo usato in molti posti diversi in Haskell)? Otteniamo lo stesso tipo di dati Parse Whatever , ma senza l'indirezione aggiuntiva.

    
posta Savanni D'Gerinel 05.04.2013 - 14:55
fonte

2 risposte

8

La risposta è che Haskell non ha lambdas di tipo arbitrario, quindi quando vogliamo finalmente rendere il nostro Parse digitare un'istanza di Monad , è richiesto un newtype .

    
risposta data 05.04.2013 - 20:03
fonte
2

Sembra che usare la notazione con cui stai discutendo sia un punto di contesa. Dai commenti su quella pagina di World World Haskell:

I'm trying to go through the monad chapter now (chapter 14), and it looks more and more like the parse example in this chapter is somewhat contrived, in that some concepts it presents don't make sense and lead to what looks like needlessly hard-to-understand and complicated code...

e

While newtype and record syntax are explained in chapter 6, here (and for the rest of the book) they're not used for "records", just for what looks like a poor man's substitute for encapsulation. I can't really see why. Isn't the module system provided by Haskell enough for this purpose?

In altre parole, la risposta potrebbe essere "non farlo".

    
risposta data 05.04.2013 - 15:50
fonte

Leggi altre domande sui tag