Comment faire des expressions lambda multilignes en f #?
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);
}
}
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.