Conversion de IO Int en Int
J'ai créé une liste déroulante à partir de la conversion d'un xmlWidget
à un comboBox
avec la fonction castTocomboBox
et maintenant je veux obtenir le texte ou de l'indice de l'élément actif. Le problème est que si j'utilise le comboBoxGetActive
fonction qui retourne un IO Int
résultat et j'ai besoin de savoir comment puis-je obtenir le Int
valeur. J'ai essayé de lire sur les monades pour que je puisse comprendre ce que l'on pourrait faire dans une situation comme ça, mais je ne semblent pas comprendre. J'apprécie toute l'aide que je peux obtenir. Je devrais probablement mentionner que j'utilise Glade
et gtk2hs
.
source d'informationauteur izayoi
Vous devez vous connecter pour publier un commentaire.
Comme une règle générale que vous écrivez quelque chose comme ceci:
Il n'existe aucun moyen pour obtenir le "Int" un "IO Int", sauf à faire quelque chose d'autre dans le IO Monade.
Dans la monade termes, le code ci-dessus desugars en
La ">>= '" opérateur (prononcé "bind") fait la magie de la conversion de la "IO Int" dans un "Int", mais il refuse de donner Int directement à vous. Il ne fera que passer cette valeur dans une autre fonction comme argument, et que la fonction doit retourner une autre valeur dans "IO". Méditer sur le type de bind pour l'IO monade pendant quelques minutes, et vous pouvez être éclairée:
Le premier argument est votre premier "IO Int" valeur "comboBoxGetActive" est de retour. La deuxième est une fonction qui prend la valeur Int et il se transforme en quelques autres IO valeur. Ainsi, vous pouvez traiter l'Int, mais les résultats de le faire de ne jamais sortir de l'IO monade.
(Bien sûr il y a le fameux "unsafePerformIO", mais à votre niveau de connaissance, vous pouvez être certain que si vous l'utilisez, alors vous faites fausse route.)
(En fait la desugaring est un peu plus complexe pour permettre de l'échec des schémas de correspondances. Mais vous pouvez prétendre ce que j'ai écrit est vrai)
Bien, il n'y a unsafePerformIO: http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/System-IO-Unsafe.html#v:unsafePerformIO
(Si vous voulez savoir comment faire pour trouver cette méthode: Aller à http://www.haskell.org/hoogle et de recherche pour la signature que vous avez besoin, ici
IO a -> a
)Cela dit, vous avez probablement entendu parler de "Ce qui se passe dans IO reste dans IO". Et il y a très de bonnes raisons pour cela (il suffit de lire la documentation de unsafePerformIO). Si vous avez un problème de conception, mais dans le but d'obtenir de l'aide de l'expérience Haskellers (je ne suis certainement pas), vous devez décrire votre problème plus détaillée.
De comprendre ce que sont ces types sont –étape par étape, regardez d'abord ce que Peut-être et de la Liste sont:
(Peut-être un) est un type différent de (un), comme (Peut-être Int) diffère de (Int).
Exemple de valeurs de type (Peut-être Int) sont
À seulement 5 et Rien.
Une Liste de (un)s peut s'écrire: ([ ] un) et ([a]). Exemple de valeurs de ([Int]) sont [1,7,42] et [ ].
Maintenant, un (IO un) est une chose différente de (un), trop: C'est une Entrée/Sortie-calcul qui calcule une valeur de type (un). En d'autres termes: c'est un script ou un programme qui doit être exécuté pour générer une valeur de type (un).
Un Exemple de (IO String) est getLine, qui lit une ligne de texte à partir de la norme d'entrée.
Maintenant, le type de comboBoxGetActive est:
Cela signifie, que comboBoxGetActive est une fonction (->) que des cartes à partir de n'importe quel type qui a une instance de la classe ComboBoxClass (type primitif, les classes sont en quelque sorte similaire à java-interfaces) à un (IO Int). À chaque fois, cette fonction (->) est évaluée avec la même valeur d'entrée de ce type (auto) (quel que soit ce type est), il en résulte la même valeur: C'est toujours la même valeur de type (IO Int), ce qui signifie qu'il est toujours le même scénario. Mais lorsque vous exécutez le même script à différents moments, il peut produire des valeurs différentes de type (Int).
La fonction principale de votre programme a pour type (IO ()), ce qui signifie que le compilateur et le système d'exécution évaluer les équations que vous pouvez programmer dans ce langage fonctionnel à la valeur du principal, qui sera exécutée dès que vous démarrez le programme.