Domanda

Come lo farei (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);
    }
}
È stato utile?

Soluzione

Un lambda multilinea in F # è solo

(fun args ->
    lots
    of
    code
    here
)

L'intero codice sarebbe simile a

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)

supponendo che non abbia fatto errori di trascrizione. (Ho usato i tipi di funzione F # anziché i delegati Action nell'interfaccia pubblica.)

Altri suggerimenti

Se tutto ciò che vuoi fare è scrivere lambda su più righe, puoi mettere insieme più istruzioni usando l'operatore punto e virgola tra parentesi. Esempio:

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

e

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

Sebbene il secondo esempio che ho dato funzioni solo se il tipo di val è stringa.

Avvertenza: non conosco i dettagli di F #. Sto scrivendo questo da uno sfondo Obiettivo Caml. Le lingue sono molto simili, ma potrebbero esserci alcune differenze che rendono leggermente errato il mio suggerimento. Inoltre, non sono su una macchina con un ocaml o un interprete F # ora, quindi non posso controllare questi frammenti per assicurarmi che funzionino.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top