Wie mehrzeilige Lambda-Ausdrücke in f # zu tun?
Frage
Wie würde ich tun, um diesen (C #) in F #
public class MyClass
{
void Render(TextWriter textWriter)
{
Tag(() =>
{
textWriter.WriteLine("line 1");
textWriter.WriteLine("line 2");
});
Tag(value =>
{
textWriter.WriteLine("line 1");
textWriter.WriteLine(value);
}, "a");
}
public void Tag(Action action)
{
action();
}
public void Tag<T>(Action<T> action, T t)
{
action(t);
}
}
Lösung
Ein mehrzeilige Lambda in F # ist nur
(fun args ->
lots
of
code
here
)
Der ganze Code wäre so etwas wie
open System.IO
type MyClass() as this =
let Render(tw : TextWriter) =
this.Tag(fun() ->
tw.WriteLine("line1")
tw.WriteLine("line2")
)
this.Tag(fun(value : string) ->
tw.WriteLine("line1")
tw.WriteLine(value)
, "a"
)
member this.Tag(action) =
action()
member this.Tag(action, x) =
action(x)
vorausgesetzt, ich keine Übertragungsfehler gemacht. (I verwenden F # Funktionstypen anstatt Aktion Delegierten in der öffentlichen Schnittstelle.)
Andere Tipps
Wenn alles, was Sie tun möchten, ist mehrzeiligen Lambda-Ausdrücke schreiben, können Sie String mehrere Anweisungen zusammen das Semikolon-Operator in Klammern. Beispiel:
(fun () -> (write_line "line 1" ; write_line "line 2"))
und
(fun val -> (write_line "line 1" ; write_line val))
Obwohl das zweite Beispiel habe ich nur funktioniert, wenn val der Typ string ist.
Vorab: Ich weiß nicht, die Angaben von F #. Ich schreibe dies von einem Ziel Caml Hintergrund. Die Sprachen sind sehr ähnlich, aber es kann einige Unterschiede, die mein Vorschlag etwas falsch machen. Auch ich bin nicht an einer Maschine mit einem ocaml oder F # Dolmetscher jetzt so kann ich nicht diese Schnipsel überprüfen, um sicherzustellen, dass sie funktionieren.