f#で複数行のラムダ式を実行するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/814278

  •  03-07-2019
  •  | 
  •  

質問

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);
    }
}
役に立ちましたか?

解決

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)

筆記ミスがないと仮定します。 (パブリックインターフェイスでActionデリゲートではなくF#関数タイプを使用しました。)

他のヒント

複数行のラムダを作成するだけの場合は、括弧内のセミコロン演算子を使用して、複数のステートメントを一緒に文字列化できます。例:

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

and

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

2番目の例は、valの型が文字列の場合にのみ機能します。

警告:F#の詳細はわかりません。これはObjective Camlの背景から書いています。言語は非常に似ていますが、いくつかの違いがあり、私の提案を少し間違っています。また、私は現在ocamlまたはF#インタープリターを備えたマシンにいないので、これらのスニペットをチェックして動作することを確認することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top