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 Render
prend un string
paramètre, puis renvoie une fonction qui prend un IContext
et 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 " Render
prend une chaîne, puis un IContext
et 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
Enregistrer un commentaire