Como fazer expressões lambda de várias linhas em f #?
Pergunta
Como eu iria fazer isso (C #) em 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);
}
}
Solução
A lambda multi-linha em F # é apenas
(fun args ->
lots
of
code
here
)
O código inteiro seria algo como
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)
supondo que eu não fez erros de transcrição. (Eu usei F # tipos de função em vez de delegados ação na interface pública).
Outras dicas
Se tudo que você quer fazer é escrever lambdas multi-linha, você pode cordas várias declarações em conjunto, utilizando o operador ponto e vírgula dentro de parênteses. Exemplo:
(fun () -> (write_line "line 1" ; write_line "line 2"))
e
(fun val -> (write_line "line 1" ; write_line val))
Embora o segundo exemplo que dei só funciona se o tipo de val é string.
Aviso: Eu não sei os detalhes de F #. Eu estou escrevendo isso a partir de um fundo Caml Objetivo. As línguas são muito semelhantes, mas pode haver algumas diferenças que fazem a minha sugestão ligeiramente errado. Além disso, eu não estou em uma máquina com um ocaml ou F # intérprete agora, então eu não pode verificar esses trechos para garantir que eles trabalham.