Question

Comment ferais-je cela (C #) en fa #

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);
    }
}
Était-ce utile?

La solution

Un lambda multiligne en F # est juste

(fun args ->
    lots
    of
    code
    here
)

L'ensemble du code serait quelque chose comme

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)

en supposant que je n’ai fait aucune erreur de transcription. (J'ai utilisé les types de fonction F # plutôt que les délégués d'action dans l'interface publique.)

Autres conseils

Si vous souhaitez uniquement écrire des lambda à plusieurs lignes, vous pouvez chaîner plusieurs instructions ensemble à l'aide de l'opérateur de point-virgule placé entre parenthèses. Exemple:

(fun () -> (write_line "line 1" ; write_line "line 2"))

et

(fun val -> (write_line "line 1" ; write_line val))

Bien que le deuxième exemple que j'ai donné ne fonctionne que si le type de val est string.

Avertissement: je ne connais pas les détails de F #. J'écris ceci à partir d'un fond d'Objective Caml. Les langues sont très similaires, mais il se peut que certaines différences rendent ma suggestion légèrement fausse. De plus, je ne suis pas présent sur une machine avec un interprète ocaml ou F #, je ne peux donc pas vérifier ces extraits pour s’assurer qu’ils fonctionnent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top