|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 1 ![]() |
Salut à tous,
j'apprends le Haskell par moi-même, je me heurte à des points que je ne comprends pas. Il est mentionné que la fonction unsafePerformIO est une fonction à éviter, dangereuse etc, si j'ai bien compris, elle peut retourner des résultats différents ce qui est contre la transparence référentielle. Sur la page http://cvs.haskell.org/Hugs/pages/li...IO-Unsafe.html Il est donné un bout de code qui est censé mettre en évidence ce fait, mais je n'arrive pas à voir en quoi ça prouve que quelque chose ne va pas, une explication ? Quelqu'un pourrait me fournir d'autres bouts de code que je peux tester et qui mettraient en évidence des comportements bizarres ? Merci d'avance. |
|
|
00
|
|
|
#2 | ||||
|
Membre confirmé
![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 89 ![]() |
Soit la fonction hasard suivante
Quand elle sera exécutée, elle produira un nombre entier aléatoire. Soit maintenant la fonction foo suivante Code :
Code :
Cette caractéristique importante permet à GHC de faire d'importantes optimisations par la suite. Cela rassure également le développeur, qui ne sera pas inquiet une seconde que la fonction 'exemple' lance un missile avant d'ajouter 2 à son entier. Le problème avec unsafePerformIO, c'est qu'elle permet de tromper le compilateur. la fonction foo est considérée comme pure alors que pour tout x appartenant aux entiers, foo x /== foo x !
__________________
Deikonad - Fonctional Programming |
||||
|
00
|
|
|
#3 | ||
|
Membre confirmé
![]() ![]() Inscription : décembre 2005 Messages : 165 ![]() |
Au risque de passer pour la réincarnation de Maître Capello, je me permets de rectifier quelques abus de langages.
Citation:
Citation:
Ce qu’on a pas par contre, c’est : Code :
x, y | x = y => unsafePerformIO (foo x) = unsafePerformIO (foo y) |
||
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 89 ![]() |
@Chatanga
J'ai peut-être mal compris ton poste mais dans la fonction foo 'unsafePerformIO hasard' sera bien exécutée sur le champ. Comme le prouve le vrai programme ci-dessous: Code :
Les monades n'ont rien à voir la dedans
__________________
Deikonad - Fonctional Programming |
||
|
00
|
|
|
#5 |
|
Membre confirmé
![]() ![]() Inscription : décembre 2005 Messages : 165 ![]() |
Je dis effectivement n’importe quoi ! J’ai interverti les fonctions 'hasard' et 'foo' en lisant ton équation.
Ah bah si quand même : la fonction 'hasard' retourne bien une valeur monadique... Ou alors ce n’est pas seulement que je suis distrait, mais que je n’ai rien compris. |
|
|
00
|
|
|
#6 |
|
Membre confirmé
![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 89 ![]() |
la fonction 'hasard' a pour type IO Int. Ceci n'est pas un type monadique. D'ailleurs cette dénomination n'a aucun sens.
Par contre, là où je suis d'accord avec toi, c'est que IO est une instance de la classe Monad. Ce fait n'a absolument aucun rapport avec la problématique de la discussion. Monad n'est pas un type mais une classe. Ce n'est pas la même chose.
__________________
Deikonad - Fonctional Programming |
|
00
|
|
|
#7 |
|
Membre du Club
![]() Inscription : août 2009 Messages : 38 ![]() |
Je pense que c'est ce que Chatanga veut dire par type monadique... un type instanciant la classe Monad. Ça me semble plein de sens compris ainsi. Non ?
|
|
|
00
|
|
|
#8 |
|
Membre confirmé
![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 89 ![]() |
Certes mais dans son premier message, il indique vouloir éviter les abus de langage.
Dire que IO a est un type monadique est un abus de langage vu que Monad n'est pas un type mais une classe. Pour bien comprendre Haskell par la suite, il est important de bien faire la différence. De nombreux débutants du langage pensent que les classes en Haskell sont équivalentes aux interfaces en Java par exemple. Bien que ressemblant sur le principe, ces 2 notions sont très différentes.
__________________
Deikonad - Fonctional Programming |
|
00
|
|
|
#9 | |
|
Membre confirmé
![]() ![]() Inscription : décembre 2005 Messages : 165 ![]() |
Je ne parle pas de type monadique, mais de valeur monadique, ce qui me semble juste pour désigner une valeur dont le type est une instance de la classe Monad. On peut même être plus compréhensif :
Citation:
|
|
|
|
00
|
|
|
#10 | ||
![]() ![]() Inscription : juin 2005 Messages : 8 586 ![]() |
Un autre exemple au cas où...
Code :
Et d'ailleurs, compiler ça sous Windows est encore pire, par exemple. T'as ce qui est censé être une valeur fixe qui en fait représente un plantage de ton programme au moment où ce unsafePerformIO sera exécuté!
__________________
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++ Le guide pour bien débuter en C++ |
||
|
00
|
Copyright © 2000-2013 - www.developpez.com