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.