La différence entre l'impression et la putStrLn en Haskell
Je suis confus. J'ai essayé d'utiliser print
, mais je sais que les gens s'appliquent putStrLn
. Quelles sont les réelles différences entre eux?
print $ function
putStrLn $ function
print = putStrLn . show
- Avez-vous essayé de lancer
print 3
,putStrLn 3
,print "three"
,putStrLn "three"
dans ghci? C'est vraiment une question qui peut être répondu par un peu d'expérimentation.
Vous devez vous connecter pour publier un commentaire.
La fonction
putStrLn
prend unString
et l'affiche à l'écran, suivi par un caractère de saut de ligne (mettre un String suivie par une nouvelle Ljene).Car il ne fonctionne qu'avec
String
s, un idiome commun est de prendre n'importe quel objet, de le convertir à uneString
, puis appliquerputStrLn
pour l'afficher. La méthode générique permettant de convertir un objet à unString
est avec leshow
de la fonction, de sorte que votre code jusqu'à la fin avec beaucoup deUne fois que vous remarquez que ce n'est pas un très gros tronçon de définir une fonction qui convertit un
String
et affiche la chaîne de caractères en une seule étapequi est exactement ce que le
print
fonction.putStrLn
peut afficher les caractères non ASCII comme "я" alors queprint
ne peut pas. Je ne sais pas vraiment pourquoi mais. EssayezputStrLn "я"
vsprint "я"
.print
appels de fonctionputStrLn
sur la sortie deshow
, et lashow
fonctions convertit les chaînes de leur représentation unicode afin de les afficher. L'unicode point pour "я' (Cyrillique lettre "ya") est U+044F, ou 1103 en décimal, ce qui est pourquoishow "я"
sorties"\"\\1103\""
- c'est ce que vous avez à taper dans ghci pour obtenir la chaîne de caractères composée de sept caractères"\1103"
(essayer!)putStrLn
lorsque vous travaillez avec du texte en général?String
que vous souhaitez imprimer à l'écran, vous devez utiliserputStrLn
. Si vous avez quelque chose autre que unString
que vous souhaitez imprimer, vous devez utiliserprint
. Regardez les types!putStrLn :: String -> IO ()
etprint :: Show a => a -> IO ()
.putStrLn
etprint
est queprint
appelsshow
sur son entrée en premier. Toute différence entre le résultat est parce que vous avez appeléshow
sur l'entrée dans un cas et pas dans l'autre. Donc au moment de choisir laquelle utiliser, demandez - vous- ai-je envie d'appelshow
sur l'entrée ou non? Si l'entrée est uneString
alors vous avez presque certainement ne pas voulez l'appelershow
sur elle d'abord.