GOOGLE ADS

Samstag, 30. April 2022

Mehrere Parameter für Methoden in F#

Ich habe eine in F# geschriebene Klasse, die ich in C# verwende und die eine Methode definiert 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()

The signature of this method is template:string -> (IContext -> string), which of course reads as "member Render takes a string parameter, then returns a function that takes an IContext and produces a string.

Wenn ich die Deklaration von "Member" in eine Let-Bindung ändere und sie als lokale Funktion für die Klassendefinition definiere:

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

Dann wird die Signatur zu dem, was Sie erwarten würden - string -> IContext -> string, was lautet " Rendernimmt eine Zeichenfolge, dann eine IContextund erzeugt eine Zeichenfolge".

Gibt es eine Möglichkeit, ein Mitglied dazu zu bringen, sich wie die Let-Bindung zu verhalten? Dies verursacht Probleme bei der Verwendung dieses Members aus C#, da die Signatur zu wird Render(string, FastFunc<IContext, string>), was nicht übermäßig verwendbar ist.


Lösung des Problems

If you want to expose to C#, you should write it tupled style:

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

Dadurch wird eine normale Methode im.NET-Stil verfügbar gemacht.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...