Sortie Entier stdout en Haskell
J'ai une fonction simple comme:
nth :: Integer -> Integer
Et j'essaie d'imprimer le résultat comme suit:
main = do
n <- getLine
result <- nth (read n :: Integer)
print result
L'erreur suivante est générée:
Couldn't match expected type `IO t0' with actual type `Integer'
In the return type of a call of `nth'
In a stmt of a 'do' expression:
result <- nth (read n :: Integer)
Aussi essayé avec putStrLn
et beaucoup d'autres combinaisons avec pas de chance.
Je ne peux pas la comprendre, et j'aurais besoin d'un peu d'aide, parce que je ne pas bien comprendre comment ça marche autour de ces IO
s.
one-liner:
main = print . nth . read =<< getLine
OriginalL'auteur Iulius Curt | 2012-04-21
Vous devez vous connecter pour publier un commentaire.
nth
est une fonction, pas unIO
action:Car il ne fait pas I/O...?
Faire de la syntaxe et de la lie (
x <- action
) est seulement utilisé pour des Monades. Si vous êtes un débutant, alors les chances sont la seule monade que vous utilisez estIO
. si votre fonction n'est pas dans la formefunc :: a -> IO b
ou même justefunc :: IO b
, alors vous ne pouvez pas utiliser bind, mais vous pouvez utiliser une instruction let.Très bien, merci. Mais quelle est la différence entre l'utilisation d'un
let
avantprint
et de l'appeler directementprint nth (read...)
?Il n'y a pas de différence.
print (nth (read n :: Integer))
fonctionnera aussi bien.<-
est de ne pas enregistrer les valeurs intermédiaires - c'est à déballer monadique valeurs. Utilisationlet
pour enregistrer des valeurs intermédiaires (endo
blocslet
a une syntaxe légèrement différente qu'à l'extérieur de faire des blocs) et<-
pour extraire des valeurs de monadique valeurs.OriginalL'auteur Thomas M. DuBuisson
La
do
syntaxe déballe quelque chose à l'intérieur d'une monade. Tout sur le côté droit de la flèche doit vivre à l'intérieur de l'IO monade, sinon les types de ne pas vérifier. UnIO Integer
serait bien dans votre programme.do
est sucre syntaxique pour la plus explicite d'une fonction qui serait écrit comme suit:Rappeler que
(>>=) :: m a -> (a -> m b) -> m b
Mais
nth
n'est pas une valeur monadique, de sorte qu'il n'est pas logique d'appliquer la fonction(>>=)
, qui exige quelque chose avec le typeIO a
.m0 a0
j'ai été reçu..."Pour préciser un peu plus,
m0
vient du fait que(>>=) :: Monad m => m a -> (a -> m b) -> m b
. Il fonctionne pour tous les monade, non seulementIO
, et dans votre cas, le compilateur n'a pas eu la chance de comprendre quem
estIO
, donc il a mism0
dans le message d'erreur.OriginalL'auteur rotskoff