Aussi, n'est-il pas possible de décrire à peu près tout non-pure fonction comme une fonction de la réalité du monde? Par exemple, ne peut-on pas penser, dire, C malloc comme étant une fonction qui prend un Réaliste et un entier et renvoie un pointeur et un RealWorld, seulement, tout comme dans les IO monade le RealWorld est implicite?
Pour sûr ...
L'idée de la programmation fonctionnelle est de décrire les programmes comme une combinaison de petites, les indépendants, les calculs de la construction de plus gros calculs.
Ces indépendante des calculs, vous aurez de nombreux avantages, allant de concise programmes de manière efficace et efficiente parallélisables codes, la paresse jusqu'à l'rigoureux de garantir que le contrôle de flux comme prévu - avec aucune chance de l'interférence ou la corruption de données arbitraires.
Maintenant - dans certains cas (comme IO), nous avons besoin d'impur code. Les calculs impliquant de telles opérations ne peuvent pas être indépendants, ils peuvent muter de données arbitraires d'un autre calcul.
Le point est - Haskell est toujours pure, IO
ne change pas cela.
Donc, notre impur, non indépendants et des codes pour obtenir une commune de la dépendance que nous avons à passer une RealWorld
. Donc quel que soit le spi calcul nous voulons, nous devons passer par cette RealWorld
chose pour appliquer les changements et toutes les autres stateful calcul veut voir ou de faire des modifications, à savoir l' RealWorld
trop.
Que ce soit explicitement ou implicitement, par le biais de l' IO
monade n'est pas pertinent. Vous construisez un Haskell programm comme un géant de calcul qui transforme les données, et une partie de ces données est l' RealWorld
.
Une fois la première main :: IO ()
qui est appelé lorsque votre programme est exécuté avec les cours actuels du monde réel comme un paramètre, ce monde réel obtient sur l'ensemble impur calculs impliqués, comme données en State
. C'est ce que monadique >>=
prend soin de.
Et où l' RealWorld
n'obtiennent pas (comme dans le plus pur calculs ou sans >>=
-ing main
), il n'y a aucune chance de faire quelque chose avec elle. Et où est - t get, qui est passé par purement fonctionnelle en passant de (implicite) de paramètre. C'est pourquoi
let foo = putStrLn "AAARGH" in 42
ce qui n'a absolument rien - et pourquoi l' IO
monade - comme tout le reste - est de la pure. Ce qui se passe à l'intérieur de ce code peut bien sûr être impur, mais il est tout coincé à l'intérieur, n'a aucune chance d'interférer avec les non-connectés calculs.