質問
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#インタープリターを備えたマシンにいないので、これらのスニペットをチェックして動作することを確認することはできません。
所属していません StackOverflow