Как сделать многострочные лямбда-выражения в f #? - PullRequest
16 голосов
/ 02 мая 2009

Как бы я это сделал (C #) в 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);
    }
}

Ответы [ 2 ]

26 голосов
/ 02 мая 2009

Многострочная лямбда в F # - это просто

(fun args ->
    lots
    of
    code
    here
)

Весь код будет выглядеть примерно так:

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)

при условии, что я не сделал ошибок транскрипции. (Я использовал типы функций F # вместо делегатов Action в открытом интерфейсе.)

5 голосов
/ 02 мая 2009

Если все, что вы хотите сделать, это написать многострочные лямбды, вы можете связать несколько операторов вместе, используя оператор точки с запятой в скобках. Пример:

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

и

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

Хотя второй пример, который я привел, работает, только если типом val является строка.

Предостережение: я не знаю особенностей F #. Я пишу это из фона Objective Caml. Языки очень похожи, но могут быть некоторые различия, которые делают моё предположение немного неверным. Кроме того, сейчас у меня нет машины с интерпретатором ocaml или F #, поэтому я не могу проверить эти фрагменты, чтобы убедиться, что они работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...