8
votes

"Paresseux io" à Haskell?

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.


1 commentaires

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?


3 Réponses :


14
votes

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)
...


1 commentaires

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 .



3
votes
unsafeInterleaveIO :: IO a -> IO a

0 commentaires

8
votes

La méthode la plus simple de faire de la paresseuse IO implique des fonctions telles que Interact , lishfile , hgetContents , 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 que Éphémique Mentions, vous pouvez également construire vos propres fonctions de cette façon si vous le souhaitez.

D'autre part, il peut être judicieux de noter que insaferleaveo est exactement ce qu'il dit sur l'étain: dangereux IO . Utilisation de cela - ou de fonctions basées sur elle-- rompt la pureté et la transparence référentielle < / a>. Cela permet aux fonctions apparemment (c'est-à-dire que cela ne renvoie pas une action io ) 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 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.

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.


0 commentaires