J'essaie les codes de < Real World Haskell >.Quelle est la différence entre 'err @ (Left _)' et 'Left err'
sur la version 6.10.4 GHC:
data ParseState = ParseState {
string :: String
} deriving (Show)
newtype Parse a = Parse {
runParse :: ParseState -> Either String (a, ParseState)
}
parse :: Parse a -> String -> Either String a
parse parser initState =
case runParse parser (ParseState initState) of
Left err -> Left err
Right (result, _) -> Right result
Tout allait bien jusqu'à ce que je l'ai changé 'err gauche' à 'err @ (gauche _)':
-- [email protected](Left _) -> err
{-
- Occurs check: cannot construct the infinite type:
- a = (a, ParseState)
- When generalising the type(s) for `parse'
-}
Toutes les idées?
Merci, je suis juste le livre. Je vais faire une note mentale pour Control.Arrow et revenir plus tard. En ce qui concerne votre réponse à ma question, cela a du sens pour moi. Mais pensez-vous que le compilateur devrait être rendu plus intelligent pour savoir que err dans 'err @ (Left _)' a été apparié à un constructeur de données de gauche? – aXqd
Non, je ne pense pas que ça devrait être plus intelligent. Ce n'est qu'une des subtilités du système de types, mais elle est cohérente. Un système de type capable de reconnaître de telles choses existe probablement (des GADT sont en route), mais il est plus compliqué à implémenter et a probablement plus de subtilités en usage ailleurs pour le compenser. Hindley-Milner est un bon point d'équilibre. – luqui
Y at-il une erreur dans le type de (+++)? Ne devrait-il pas être (+++) :: (a-> a ') -> (b-> b') -> Soit un b -> Soit un 'b' –