F#中的对象/记录的无点样式

时间:2009-06-03 06:48:39

标签: f# functional-programming function methods

当尝试使用无点功能样式进行编程时,“点符号”与对象和记录一起工作的方式受到了阻碍(我认为这是一种使用默认情况下编程的函数式语言的简洁方法)。

是否有我缺少的操作员或功能,让我可以执行以下操作: (.) object method代替object.method

(从我读到的关于新?运算符的内容来看,我认为它的工作方式是这样的。除了它需要定义并进入整个动态绑定事物,我认为我不需要。)< / p>

换句话说,我可以将一个方法作为参数应用于其对象,就像我将一个普通函数应用于它的参数一样吗?

2 个答案:

答案 0 :(得分:5)

简答:不。

更长的答案:您当然可以在调用给定类型的方法的模块中创建let-bound函数...例如在代码中

let l = [1;2;3]
let h1 = l.Head 
let h2 = List.hd l

有一种感觉,“List.hd”是你想要的“.Head on a list”的版本。或者在本地,您总是可以这样做。

let AnotherWay = (fun (l:list<_>) -> l.Head)
let h3 = AnotherWay l

但是没有什么是通用的,因为没有好的方法来命名给定类型的任意实例方法; 'AnotherWay'显示了一种方法“在'列表&lt; _&gt;'上'从'Head'属性中创建一个函数对象“,但是你需要为每个要作为第一类函数值处理的实例方法使用这样的样板文件。

我建议创建一个语言结构来概括这个:

  

关于语言设计   建议,如果

 SomeType..Foo optArgs   // note *two* dots 
     

 fun (x : SomeType) -> x.Foo optArgs 
     

在这种情况下你可以写

list<_>..Head

作为一种'功能化'这个实例属性的方法,但是如果我们在F#中的那个领域做任何事情,那么它将是VS2010之后。

答案 1 :(得分:2)

如果我理解你的问题,答案是:不,你不能。点(。)不是F#中的运算符,它内置于语言中,因此不能用作函数。