【问题标题】:Point-free style with objects/records in F#F# 中带有对象/记录的无点样式
【发布时间】:2010-10-30 21:56:13
【问题描述】:

在尝试以无点函数式编程时,“点表示法”与对象和记录一起工作的方式让我受阻(我认为这是使用默认 curries 的函数式语言的一种很好、简洁的方式)。

是否有我缺少的运算符或函数可以让我执行以下操作: (.) object method 而不是 object.method?

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

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

【问题讨论】:

  • 听起来和看起来都令人不安(由于需要更多括号)恐怕没有办法。

标签: f# functional-programming function methods


【解决方案1】:

简短回答:不。

更长的答案:您当然可以在模块中创建 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' 展示了一种“从 'list<_>' 对象的 'Head' 属性中创建函数”的方法,但是对于要视为一流函数值的每个实例方法,您都需要这样的样板文件。

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

关于语言设计 建议,如果

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

意思

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

?

在这种情况下你可以写

list<_>..Head

作为“功能化”此实例属性的一种方式,但如果我们曾经在 F# 的那个领域做任何事情,那将是 VS2010 之后的事情。

【讨论】:

  • 在某些情况下,我需要将一系列字符串“映射”到它们各自的长度,并且必须创建一个 lambda 以便我可以访问它的实例属性。我很想看到一种像这样静态访问它们的方法。不过,这会使一些现有功能变得多余。 (如 List.hd)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多