Paramètres multiples aux méthodes en F #

J'ai une classe écrite en F# que je consomme en C#, qui définit une méthode Render:

member this.Render template (context: IContext) =
let tokens = Lexer.tokenize template
let parser = new DefaultParser([for filter in _filters -> filter])
let resp = new StringBuilder()
for node in parser.Parse tokens None do
ignore <| resp.Append(node.render context)
resp.ToString()

La signature de cette méthode est template:string -> (IContext -> string), qui se lit bien sûr comme "le membre Renderprend un stringparamètre, puis renvoie une fonction qui prend un IContextet produit une chaîne.

Si je change la déclaration de "member" en une liaison let, en la définissant comme une fonction locale à la définition de classe :

let Render template (context: IContext) =...

Ensuite, la signature devient ce que vous attendez qu'elle soit - string -> IContext -> string, qui se lit " Renderprend une chaîne, puis un IContextet produit une chaîne".

Existe-t-il un moyen de faire en sorte qu'un membre se comporte comme la liaison let? Cela entraîne des problèmes de consommation de ce membre à partir de C #, car la signature devient Render(string, FastFunc<IContext, string>), ce qui n'est pas trop utilisable.


Solution du problème

Si vous souhaitez exposer à C #, vous devez l'écrire dans le style tuple:

> type Foo =
- member this.Bar (param1, param2) = param1 + param2;;
type Foo =
class
member Bar: param1:int * param2:int -> int
end

Cela exposera une méthode de style.NET normale.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"