如何在f#中进行多行lambda表达式?

Sim*_*mon 16 lambda f#

我将如何在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 27

F#中的多行lambda就是

(fun args ->
    lots
    of
    code
    here
)
Run Code Online (Sandbox Code Playgroud)

整个代码就像是

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)
Run Code Online (Sandbox Code Playgroud)

假设我没有抄写错误.(我在公共接口中使用了F#函数类型而不是Action委托.)

  • 很酷,但他的例子中的C#代码如何看待F#? (2认同)

A. *_*evy 5

如果您只想编写多行lambda,则可以使用括号内的分号运算符将多个语句串在一起.例:

(fun () -> (write_line "line 1" ; write_line "line 2"))
Run Code Online (Sandbox Code Playgroud)

(fun val -> (write_line "line 1" ; write_line val))
Run Code Online (Sandbox Code Playgroud)

虽然我给出的第二个例子只有在val的类型是字符串时才有效.

警告:我不知道F#的细节.我是从Objective Caml背景写的.这些语言非常相似,但可能会有一些差异使我的建议略显错误.此外,我现在不在使用ocaml或F#解释器的机器,因此我无法检查这些片段以确保它们正常工作.