使用对象/记录的点无风格编程在F#中

3
我在尝试以无参式函数编程风格编写代码时,使用对象和记录的“点表示法”让我感到困惑(我认为这是一种精简的使用默认柯里化的函数式语言的方式)。请问是否有我所缺失的运算符或函数可以实现以下操作:(.) object method而不是object.method?
(根据我对新的?运算符的了解,我认为它可以实现这个功能。但是它需要定义并涉及整个动态绑定问题,而我认为我并不需要这样做。)
换句话说,我能否像将普通函数应用于其参数一样将方法应用于其对象作为参数?

1
尽管听起来和看起来很令人不安(因为需要加更多括号),但恐怕没有办法。 - em70
2个回答

5

简短回答:不行。

更长的回答是:你当然可以在模块中创建绑定函数,调用给定类型的方法...例如在代码中:

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'展示了一种“将'list<_>'对象上的'Head'属性制作成函数”的方法,但是你需要这样的样板文件来处理每个你想要将其视为一级函数值的实例方法。

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

With regards to language design suggestions, what if

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

meant

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

?

在这种情况下,你可以写:
list<_>..Head

作为一种“功能化”这个实例属性的方式,但如果我们在F#中做任何相关工作,将会是在VS2010之后。


2
有时我需要将一系列字符串“映射”到它们各自的长度,并且不得不创建一个lambda函数,以便我可以访问其实例属性。我希望能够像这样静态地访问它们。虽然这会使一些现有的函数变得多余。(例如List.hd) - YotaXP

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接