J C*_*per 3 methods f# functional-programming function
当我尝试使用无点功能样式进行编程时,"点符号"与对象和记录一起工作的方式受到了阻碍(我认为这是一种使用默认情况下的功能语言的简洁方法).
是否有一个我缺少的操作员或功能,让我做一些像:
(.) object method而不是object.method?
(从我读到的关于new ?运算符的内容来看,我认为它的工作原理是这样的.除了它需要定义并进入整个动态绑定之外,我认为我不需要它.)
换句话说,我可以将一个方法作为参数应用于其对象,就像我将一个普通函数应用于它的参数一样吗?
简答:不.
更长的答案:您当然可以在调用给定类型的方法的模块中创建let-bound函数...例如在代码中
let l = [1;2;3]
let h1 = l.Head
let h2 = List.hd l
Run Code Online (Sandbox Code Playgroud)
有一种感觉,"List.hd"是你想要的".Head on a list"的版本.或者在当地,你可以随时做
let AnotherWay = (fun (l:list<_>) -> l.Head)
let h3 = AnotherWay l
Run Code Online (Sandbox Code Playgroud)
但是没有什么是通用的,因为没有好的方法来命名给定类型的任意实例方法; 'AnotherWay'显示了一种"在'list <_>'对象上从'Head'属性中创建一个函数的方法",但是对于你想要作为一等函数值处理的每个实例方法,你都需要这样的样板.
我建议创建一个语言结构来概括这个:
关于语言设计建议,如果
Run Code Online (Sandbox Code Playgroud)SomeType..Foo optArgs // note *two* dots意味着
Run Code Online (Sandbox Code Playgroud)fun (x : SomeType) -> x.Foo optArgs?
在这种情况下你可以写
list<_>..Head
Run Code Online (Sandbox Code Playgroud)
作为一种'功能化'这个实例属性的方法,但是如果我们在F#中的那个领域做任何事情,那么它将是VS2010后的.