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);
    }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top