【发布时间】:2019-10-19 06:31:25
【问题描述】:
是否可以在 F# 中像函数一样应用值?例如:
let record =
{|
Func = fun x -> x * x
Message = "hello"
|}
let message = record.Message // unsweetened field access
let unsweet = record.Func 3 // unsweetened function application
let sweet = record 3 // sweetened function application
现在,当然,最后一行没有编译:
error FS0003: This value is not a function and cannot be applied.
是否有某种语法甜味剂可以让我按照我认为合适的方式“路由”功能应用程序,同时仍保留其正常的不加糖行为?我在想这样的魔法:
// magically apply a record as though it was a function
let () record arg =
record.Func arg
(注意:我在这个例子中使用了一条记录,但我也会对一个类感到满意。)
【问题讨论】:
-
我认为您正在寻找一个 隐式运算符,例如您可以在 C# 中定义的(并用于透明地调用由
Func和Action实例定义的方法)。 F# 有意识地决定不使用它们,所以你正在寻找的东西是不可能的。 -
其实可以创建一个类,继承
FSharpFunc<a, b>,实现自己的Invoke();但即便如此,它也需要显式向上转换为obj并重新向下转换为a -> b才能像普通函数一样调用它。所以我认为不可能随心所欲地做到这一点。 -
感谢两位 cmets。我认为你是对的。
标签: function functional-programming f#