|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Salut,
Ayant (enfin) réussi à compiler F# avec mono, je tente de me familiariser quelque peu avec ce langage en recodant un de mes projets OCaml j'essaie d'utiliser la construction implicite des classes pour gagner en concision, mais sans succès Code :
|
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 435 ![]() |
Pardon de jouer au rabat-joie mais le bon type interval est un type somme, on ne répétera jamais assez l'importance des types somme (qui permettent le filtrage) :
Code :
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
||
|
00
|
|
|
#3 | |
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
tout dépend de l'utilisation que tu souhaites en faire... et dans mon cas, si je passe par un type somme, il faudrait que je développe tout un module autour, et j'aurais du mal à l'utiliser dans mon architecture (F# + C#) |
|
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Citation:
Le compilateur indique un problème de typage et te demande d'ajouter une annotation de type. En lisant ton code, j'ai déduit que le paramètre 'a de Interval devait être utiliser aussi pour les variables up et down. Il faut l'indiquer, sinon le compilateur ne peut pas deviner que le paramètre est le même. Donc : Code :
let mutable (up: 'a type_inf) = MaxInf Citation:
Tu peux aussi utiliser le type somme de SpiceGuid en interne et créer une classe, juste pour l'interopérabilité avec C#. Mais tout ça dépend surtout de tes besoins. Si tu n'as pas beaucoup d'algo à faire en F#, tu peux continuer avec ta classe. Si ton problème était une erreur de syntaxe, deux solutions : - soit tu utilises le mode #light (recommandé - sera bientôt mis par défaut), n'utilise pas de tabulations ; - sinon, tu dois ajouter les mots-cle's "class" et "end". |
||
|
|
00
|
|
|
#5 | ||||||
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
Code :
Citation:
Citation:
Citation:
|
||||||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
J'ai modifié mon message entre temps. D'après ton erreur, il faut juste ajouter les mots-clés "class" et "end".
|
|
|
00
|
|
|
#7 | |
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
http://blogs.msdn.com/dsyme/archive/...r-1-9-1-8.aspx |
|
|
|
00
|
|
|
#8 |
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
pour infos, voici ma classe (presque finale, mais je ne peux pas tout mettre pour le moment
http://www.developpez.net/forums/sho...89&postcount=2 si vous avez des commentaires, n'hésitez surtout pas
|
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Quelques remarques en vrac :
Vu que tu es passé au mode light, tu peux supprimer tous les "class", "begin" et "end" de ton code. "min" et "max" sont des fonctions disponibles par défaut, comme dans Caml. Donc, évite d'utiliser ces noms pour tes valeurs (enfin, c'est pas trop grave) et pense à les utiliser (tu peux les utiliser de nombreuses fois dans ton code). Tu peux remplacer " new 'a Interval() " par "Interval()". new est facultatif pour les objets qui n'implémentent pas l'interface IDisposable. Code :
Code :
let res = Interval(Down = foo, Up = bar) Printf.sprintf "%A" est équivalent à la fonction any_to_string. |
||
|
|
00
|
|
|
#10 | |||||||||
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
Code :
Citation:
Citation:
Citation:
Citation:
effectivement, ça aide... (et ça enrichit ma liste de mots-clés pour jEdit |
|||||||||
|
|
00
|
|
|
#11 | ||||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
J'imagine que ta version de F# date un peu.
Citation:
Citation:
Code :
|
||||
|
|
00
|
|
|
#12 | ||||
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
FSharp-1.9.3.7 qui date de fin 2007, si mes souvenirs sont bons
il y a une 1-9.4.* sorti début mai 2008, mais elle ne marche pas avec mono, une dll est foireuse... il aurait fallu que je récupère celle du msi, mais j'ai pas encore eu le temps de mettre à jour mon F# sous Visual Studio Citation:
Citation:
|
||||
|
|
00
|
|
|
#13 | ||||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Je ne me suis pas plongé dans ton code au niveau algo, mais je suis convaincu qu'on peut le faire beaucoup plus court.
Tu peux commencer par déclarer ton type de cette façon : Code :
En Caml, cette astuce ne fonctionne pas. Même sans connaitre ça, tu aurais pu au moins écrire une fonction de comparaison sur les type_inf, ça aurait beaucoup réduit ton code. J'aurais tendance (à un check près) à écrire la méthode intersect de cette façon : Code :
J'ai aussi tendance à préférer du code fonctionnel pour pour ce genre de besoins. En utilisant un classique type somme et les outils de comparaison, ton code n'aura plus rien à envier au code Caml de SpaceGuid. |
||||
|
|
00
|
|
|
#14 | |
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Merci pour l'astuce de l'ordre de déclaration du type somme... ça simplifie énormement d'un coup
(du coup, ça devient plus concis que la template C++ que j'utilise, et aussi sur que la classe OCaml que j'avais faite) Citation:
Le hic est que mon analyseur va aussi utiliser des structures plus complexes... en gros pas mal de polyèdres, l'intervalle n'étant que l'approximation la plus simple à coder. Je vais donc passer par une interface, mais j'attendais d'avoir une classe bien définie je ne suis pas sûr de pouvoir faire cela en "fonctionnel pur" sans passer par une notion d'objet |
|
|
|
00
|
|
|
#15 | |||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Citation:
Code F# :
Mais ton nouveau code est plutôt pas mal aussi, les effets de bords sont bien cachés. |
|||
|
|
00
|
|
|
#16 | ||
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
une question, pour le moment les attributs Low (pas Down Citation:
|
||
|
|
00
|
|
|
#17 | |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Citation:
Mais ton code est bien aussi, tu peux le garder (et il est plus intuitif pour un développeur C#). |
|
|
|
00
|
|
|
#18 | |
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
effectivement, si l'on se décide à migrer, on va sans doute commencer par convertir pas mal de code C++ en C# (car on n'est pas sûr que tout passe avec C++/CLI) ; je ne sais pas quelle proportion sera convertie en F#
|
|
|
|
00
|
|
|
#19 |
|
Invité(e)
Messages : n/a ![]() |
Pourtant un langage ML pour faire de l'analyse statique, c'est quand même un vrai bonheur ! Après, je ne sais pas à quel point l'absence de foncteur de F# (c'est toujours le cas ?) peut être dommageable dans ce cas
|
00
|
|
|
#20 | |
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
je ne suis pas sûr qu'on ne puisse pas faire des foncteurs (ou quelque chose de proche) avec un couplage module/classe... faudra que je revois mes cours de sémantique, mais il ya certainement une transformation de l'un vers l'autre (tout comme des transformations exception -> pas d'exception, etc |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com