Как сделать многострочные лямбда-выражения в f #?
Как бы это сделать (С#) в 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);
}
}
Ответы
Ответ 1
Многострочная лямбда в 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 в общедоступном интерфейсе.)
Ответ 2
Если все, что вы хотите сделать, это писать многострочные lambdas, вы можете последовательно сгруппировать несколько операторов, используя оператор полуколонии внутри скобок. Пример:
(fun () -> (write_line "line 1" ; write_line "line 2"))
и
(fun val -> (write_line "line 1" ; write_line val))
Хотя второй пример я дал только работы, если тип val является строкой.
Предостережение: я не знаю подробностей F #. Я пишу это с фона Objective Caml. Языки очень похожи, но могут быть некоторые различия, которые делают мое предложение немного неправильным. Кроме того, я не на машине с ocaml или интерпретатором F #, поэтому я не могу проверить эти фрагменты, чтобы убедиться, что они работают.