Je suis confus sur la façon d'étiqueter une fonction comme générique sans déclaration de type explicite comme ceci nous donne p> Cependant, nous pouvons alors appeler immédiatement p> et maintenant la valeur d'ajouter est p> ('a ->' a) code>
add 2 3 // then we get
error: This expression was expected to have type string but here has type int
3 Réponses :
Si je vous comprends correctement, utilisez Inline: impression: p> link:
Faites-le Inline
let inline add a b = a + b (* val inline add : a: ^a -> b: ^b -> ^c when ( ^a or ^b) : (static member ( + ) : ^a * ^b -> ^c) *) add "Hello " "World!" // val it : string = "Hello World!" add 2 3 // val it : int = 5
Ceci est le squelette embarrassant de F # dans le placard.
Essayez ceci: p> entièrement générique! Clairement, fonction de fonction et des tuples fonctionnent. P> Essayez maintenant ceci: p> hmmm, également générique. Que diriez-vous: p> aha, dès que j'ai un hmmm, intéressant. S'avère si je fais la fonction Maintenant, le problème avec ceci est que le CLR ne prend pas en charge ce type de paramètres génériques (c.-à-d. "Toute sorte, tant qu'il a de tels membres "), donc f # doit faux em> et résoudre ces appels à la compilation. Mais à cause de cela, toute méthode qui utilise cette fonctionnalité ne peut pas être compilée à des méthodes de TRUE génériques IL, et doit donc être monomorphisée (qui est activée par Mais alors, il serait très gênant d'exiger que chaque fonction utilisant des opérateurs arithmétiques soit déclarée mais si vous marquez votre Fonction (+) code> là, il devient
int code> Pour une raison quelconque.
Continuons à jouer: p> inline code>, alors f # les em> le considère comme générique, mais cela lui donne également ce bizarre
quand code> clause, et mon Les paramètres génériques ont ce symbole étrange
^ code> au lieu de la tique habituelle.
Cette syntaxe étrange est appelée "Paramètres de type résolus statiquement" (voir ici pour une explication quelque peu cohérente), et l'idée de base est que la fonction (+) code> nécessite que ses arguments disposent d'un membre statique
(+) code> défini. Voyagons: p>
en ligne code>). P>
en ligne code>, n'est-ce pas? Donc, F # va encore une autre étape supplémentaire et essaie de résoudre ces paramètres génériques résolus statilement basés sur la manière dont ils sont instanciés ultérieurement dans le code. C'est pourquoi votre fonction se transforme en
string-> string-> chaîne code> dès que vous l'utilisez avec une chaîne code> une fois. P>
inline code>, f # n'aurait pas à corriger les paramètres, car il ne serait pas nécessaire de compiler la fonction jusqu'à IL, de sorte que vos paramètres restent intacts: p>
"C'est un squelette embarrassant de F # dans le placard." -- le seul?
Je suis sûr qu'il y en a plusieurs, mais je ne me souviens plus du sommet de ma tête.
J'imagine que c'est un duplicata; Je serais très surpris si cela n'a pas été demandé auparavant. Mais c'est une excellente explication du problème.