単純な関数を定義すると:
let myConcat a b =
a + "+" + b
次に、関数は F# のファーストクラスの値であるという主張を考えると、次のように使用できると予想されますmyConcat
。
let result = myConcat "a" (fun () -> "b")
文字列「a + b」を生成するのではなく、次のエラーが表示されます。
error FS0002: This function takes too many arguments, or is used in a context where a function is not expected
うまくいけば、私は単に構文が間違っているだけですが、F# では関数を値として真に使用できないように見えます。ここで何が起こっているのか誰か説明できますか?
編集 私が求めていることをさらに明確にするために、同等のC#コードを使用できます。
public string myConcat(string a, string b) { return a + "+" + b; }
ただし、パラメーター b で「call later function」を渡したい場合は、次のようにする必要があります。
public string myConcat(string a, Action<string> b) { return a + "+" + b(); }
または、次のように呼び出すこともできます。
Func<string> b = () => "b";
var result = myConcat("a", b());
C# は (私の知る限り)、関数が第一級の値であると主張していません。F# はそう主張します。unit -> string 関数を「遅延評価された」文字列値として扱うことができない場合の違いは何ですか?