如何在F#中使用多行lambda表达式?

19
我该如何在F#中实现这个(C#)?
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个回答

31

F#中的多行lambda表达式就是

(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 委托。)


6

如果你只想编写多行lambda表达式,可以在括号内使用分号运算符将多个语句串联起来。例如:

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

并且。
(fun val -> (write_line "line 1" ; write_line val))

尽管我给出的第二个示例仅适用于val的类型为字符串。

警告:我不了解F#的细节。我是从Objective Caml背景下编写这篇文章的。这两种语言非常相似,但可能存在一些差异,使我的建议略有错误。此外,我现在没有安装ocaml或F#解释器的计算机,因此无法检查这些片段以确保它们有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接