Je suis en train de travailler sur "Écris toi-même un interpréteur de schéma en 48 heures" et un exercice consiste à écrire une fonction en utilisant la notation "do". Ceci est la fonction:Comment écrire ceci en notation Do?
parseNumber :: Parser LispVal
parseNumber = liftM (Number . read) $ many1 digit
J'ai essayé ce qui suit, mais cela ne fonctionne pas:
parseNumber2 :: Parser LispVal
parseNumber2 = do digits <- many1 digit
return $ liftM $ (Number . read) digits
Peu importe. J'ai indenté le code incorrectement
Le type de 'liftM' est' (Monad m) => (a -> b) -> ma -> mb'. Dans ce cas, 'liftM' est' fmap' dans la monade 'Parser'. Mais '(nombre.numéros) digits' n'est pas une valeur monadique, vous rencontrez donc une erreur de type (la raison 1:' (nombre. Read) digits' n'est pas une fonction, mais est utilisée comme une fonction, raison 2: '(Nombre.lit) digits' n'est pas une valeur monadique, donc il n'a pas le type' ma' pour un monad 'm'). Cependant, 'return (Number (read (digits)))' utilisé sans 'liftM' est une valeur monadique, et équivalent (lorsqu'il est placé sur la dernière ligne) à la définition d'origine. – danportin