如果我定义一个简单的函数:
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 中传递“稍后调用函数”,我必须这样做:
public string myConcat(string a, Action<string> b) { return a + "+" + b(); }
或者我可以这样称呼它:
Func<string> b = () => "b";
var result = myConcat("a", b());
C# 并没有(据我所知)声称函数是一等值。F# 确实提出了这一要求。那么当我不能将 unit -> string 函数视为“惰性评估”字符串值时有什么区别?