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);
    }
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top