J'essaie une petite expérience à Haskell, je me demandais s'il est possible d'exploiter la paresse à traiter io. J'aimerais écrire une fonction qui prend une chaîne (une liste de caractères) et produit une chaîne, paresseusement. J'aimerais alors être absolument absorbant de nourrir paresseusement les personnages de l'IO, chaque caractère serait traité dès qu'il était disponible et que la production serait produite car les caractères nécessaires sont devenus disponibles. Cependant, je ne suis pas tout à fait sûr si / comment puis-je produire une liste paresseuse de caractères de l'entrée à l'intérieur de l'IO monade. P>
3 Réponses :
String normale Io in Haskell est paresseux. Donc, votre exemple devrait simplement fonctionner hors de la boîte.
Voici un exemple, à l'aide de la fonction "Interact", qui applique une fonction à un flux de caractères paresseux: p>
$ ghc -O2 --make A.hs $ ./A +RTS -s < /usr/share/dict/words ... 2 MB total memory in use (0 MB lost due to fragmentation) ...
Vous pouvez également voir cet effet à la ligne de commande. Exécutez le programme «A» de Don dans la coquille / terminal / quel que soit votre système d'exploitation et tapez le texte directement dans celui-ci. En supposant que la ligne tamponnée est tamponnée, lorsque vous appuyez sur Entrée après chaque ligne, vous verrez le texte filtré imprimé immédiatement, même si le programme ne semble que créer un "appel" sur filtre code>.
unsafeInterleaveIO :: IO a -> IO a
La méthode la plus simple de faire de la paresseuse IO implique des fonctions telles que D'autre part, il peut être judicieux de noter que Il existe des alternatives, bien sûr; Vous pouvez trouver des bibliothèques assorties sur Hackage qui fournissent une restriction restreinte, Safer Lazy Io ou approches conceptuellement différentes . Cependant, étant donné que les problèmes ne se posent que rarement dans une utilisation pratique, je pense que la plupart des gens sont enclins à coller avec les fonctions intégrées techniquement dangereuses. P> Interact code>,
lishfile code>,
hgetContents code>, et telle, comme dons < / fort> dit; Il y a une discussion plus étendue de ceux-ci dans le livre Real World Haskell que vous pourrait trouver utile. Si la mémoire me sert, toutes ces fonctions sont finalement implémentées à l'aide du
non réadifiantLeaveo CODE> que Éphémique Strong> Mentions, vous pouvez également construire vos propres fonctions de cette façon si vous le souhaitez. P>
insaferleaveo code> est exactement ce qu'il dit sur l'étain:
io code>) pour effectuer le monde extérieur lorsqu'il est évalué, produit des résultats différents des mêmes arguments et toutes ces autres choses désagréables. En pratique, les moyens les plus judicieux d'utiliser
insaferleaveo code> ne causeront pas de problèmes, et des erreurs simples entraînent généralement des bugs évidents et facilement diagnostiqués, mais vous avez perdu de belles garanties. P>
Veuillez clarifier: Vous voulez une fonction qui prend une chaîne et "produit" une chaîne --- "produit" = "retour", "sorties à la poignée de fichier" ou quoi? Et puis vous voulez "nourrir paresseusement les personnages de IO" --- Qu'est-ce que cela signifie?