|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre éclairé
![]() Inscription : octobre 2004 Messages : 357 ![]() |
Hello,
Est-ce que quelqu'un saurait si il est possible de faire une invocation de fonction qui serait choisie "au runtime" Pour illustrer mon besoin, j'aimerais faire un programme qui prend un String comme argument, et qui utilise cette String comme étant le nom de la fonction à invoquer. Pour simplifier, disons que mon programme "addOrSub" prenne "sub" ou "add" comme seul paramètre, et qu'il doive additioner ou soustraire deux nombres (disons 5 et 3 coder en dur c'est égal ici...) Pour le moment, j'arrive à ceci : Code :
En java, j'utiliserais la reflection pour faire cela, mais en haskell, comment faire ??? |
||
|
|
00
|
|
|
#2 | ||
|
Membre du Club
![]() Inscription : janvier 2010 Messages : 46 ![]() |
En Haskell il est possible de passer des fonctions en paramètre d'autres fonctions.
Code :
|
||
|
|
00
|
|
|
#3 | |||||
|
Membre éclairé
![]() Inscription : octobre 2004 Messages : 357 ![]() |
Citation:
Voici un autre exemple : Code :
qqch du genre : Pour écrire "publish", je rencontre actuellement deux problèmes : 1) l'introspection nécessaire à la publication de l'interface (WSDL) 2) la réception de message et le binding du xml (soap) sur mes fonctions / type . En résumer, je cherche à savoir quelle serait la manière de faire qqch qui ressemblerait à ce code java, mais en haskell ... Code :
|
|||||
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Inscription : octobre 2004 Messages : 357 ![]() |
Merci pour le lien, je vais fouiller un peu pour voir si j'y trouve qq pistes.... Je cherche surtout à voir comment faire de la réflection / introspection "par moi-même" dans le but d'apprendre haskell.
|
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : janvier 2010 Messages : 46 ![]() |
Là je ne peux pas t'aider
Peut être qu'un coup d'œil dans les sources pourra te donner des pistes. |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Haskell n'est pas un langage qui supporte la réflection/introspection.
Haskell est fortement typé, et tu comprends bien que ta méthode ne peut pas marcher : quel serait le type de la fonction "function_of_string" ? Tu prends une string, mais tu renvoies une fonction de "n'importe quel type", ça ne peut pas être bien typé. Il y a différente façon de faire quelque chose de plus ou moins équivalentes en Haskell. La plus simple est de transporter directement, au lieu de chaînes de caractères, la fonction (mais alors tu ne peux pas faire de sérialisation). Une autre façon de faire serait d'utiliser, non pas l'ensemble des fonctions Haskell, mais un type de donnée concret représentant des fonctions que tu pourrais à la fois sérialiser et "interpréter" pour les exécuter (ça revient à coder mini-langage dans ton programme, et un interpréteur pour ce langage). La réponse de fond à mon avis, c'est que Haskell est un langage très différent de Java, et que tu ne dois pas t'attendre à faire la même chose dans l'un et dans l'autre : si tu cherches à apprendre Haskell, exerce-toi à coder du Haskell, et pas à coder du Java en Haskell. |
|
|
00
|
|
|
#8 | |||
|
Membre éclairé
![]() Inscription : octobre 2004 Messages : 357 ![]() |
Citation:
Citation:
Citation:
|
|||
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Implémenter le pattern Strategy tel que je le comprends n'est pas très difficile en Haskell : comme les fonctions sont des valeurs comme les autres, il suffit de paramétrer ta logique applicative par l'opération à effectuer.
Ce qui te posait une difficulté c'est de choisir l'opération ensuite en utilisant son nom sous forme de string. Je pense que ce n'est pas nécessaire : comme les différentes stratégies/opérations sont de même type, tu peux les stocker dans une liste ou la structure que tu veux, indexées par ce que tu veux (tu peux utiliser par exemple une fonction qui selon la configuration renvoie la stratégie adaptée), et à priori par quelque chose de plus sémantique qu'une simple string (sauf bien sûr dans le cas d'une option en ligne de commande, etc.). Après, la mise en place précise de ce "pattern" sera sans doute très différente, puisque Haskell n'encourage pas du tout les effets de bord : une opération "setStrategy : string -> unit" est impensable; tu pourrais émuler ce comportement avec une monade d'effet de bord, mais ce n'est pas une bonne méthode, et il faut trouver celle qui est la plus adaptée à ton application (peut-être une Reader monad, mais le plus simple pour commencer reste de passer le choix de configuration en paramètre). |
|
|
00
|
|
|
#10 | |
|
Membre éclairé
![]() Inscription : octobre 2004 Messages : 357 ![]() |
Citation:
J'ai vu qu'il existe un module plugins-hs, j'irai peut-être voir de ce côté la lorsque j'aurai suffisamment avancé dans mon apprentissage... Je vais passer le sujet en résolu. |
|
|
|
00
|
|
|
#11 | ||
|
Membre éclairé
![]() Inscription : octobre 2004 Messages : 357 ![]() |
Bon... j'ai un peu avancé et j'arrive à cela :
Code :
Le programme marche, mais si qq y voit des améliorations, je suis preneur ! A+ |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com