【问题标题】:Functional programming languages with methods, method chaining etc具有方法、方法链等的函数式编程语言
【发布时间】:2013-01-29 17:12:42
【问题描述】:
我一直在研究函数式编程,我突然想到可能存在一种函数式语言,它具有(不可变的)对象和方法,因此支持方法链接(其中可链接的方法将返回新实例而不是改变实例调用该方法并返回它)。
这将具有可读性优势...
o.f().g().h()
... 可以说比以下更具可读性:
h(g(f(o)))
它还允许您将特定函数与特定类型的对象相关联,方法是使它们成为这些类型的方法(我理解这是面向对象语言的优势之一)。
有没有这样的语言?有任何理由相信这是一个坏主意吗?
(我知道您可以在例如 Javascript 中进行这样的编程,但 Javascript 不强制执行不变性。)
【问题讨论】:
-
你也可以只翻转(.)-operator:link。
标签:
methods
functional-programming
method-chaining
【解决方案1】:
是的,例如,F# 使用正向管道 (|>) 运算符,这使得代码非常易读。例如,
(1..20)
|> Seq.map(functionFoo)
|> Seq.map(functionBoo)
等等……
【解决方案2】:
Frege 有这个,它被称为 TDNR(类型定向名称解析)。
具体来说,如果 x 具有类型 T,并且 y 出现在 T 的命名空间中,那么 x.y 与 (T.y x) 相同,后者是简单的英文 y 来自应用于 x 的命名空间 T。
这方面的实际应用是:记录字段访问和访问本地(即 Java,因为 Frege 被编译为 Java)方法的便捷语法。
【解决方案3】:
Scala 听起来很合适——它是一种混合功能/面向对象的语言。
【解决方案4】:
您不需要对象,只需定义您自己的 reverse apply 中缀运算符,大多数函数式语言都允许您这样做。剩下的就是柯里化了。比如在OCaml:
let (>>) x f = f x
演示:
let f x y z = z * (x - y)
let g x = x + 1
let h x y = y * x
5 >> f 6 2 >> g >> h 2 (* = h 2 (g (f 6 2 5)) *)
(或者选择您喜欢的任何运营商名称;例如,其他人使用|>。)