我一直在研究函数式编程,我发现可能存在一种函数式语言,它具有方法的(不可变的)对象,因此支持方法链接(其中可链接的方法将返回新的实例而不是改变实例该方法被调用并返回它。)
这具有可读性优势......
o.f().g().h()
......可以说比以下更具可读性:
h(g(f(o)))
它还允许您将特定函数与特定类型的对象相关联,方法是将它们设置为这些类型的方法(我理解这是面向对象语言的一个优点)。
是否有任何语言表现如此?有理由相信这会是一个坏主意吗?
(我知道你可以像Javascript那样编程,但是Javascript不会强制执行不变性。)
答案 0 :(得分:2)
是的,例如,F#使用正向管道(|>)运算符,这使得代码非常易读。例如,
(1..20)
|> Seq.map(functionFoo)
|> Seq.map(functionBoo)
依旧......
答案 1 :(得分:1)
Frege有这个,它被称为TDNR(类型定向名称解析)。
具体来说,如果x具有类型T,并且y出现在T的名称空间中,那么x.y
与(T.y x)
相同,它是从应用于x的名称空间T的简单英语 y < / em>的
这方面的实际应用是:记录字段访问的便捷语法和对本机(即Java,如Frege编译为Java)方法的访问。
答案 2 :(得分:0)
Scala听起来很合适 - 它是一种混合功能/面向对象的语言。
答案 3 :(得分:0)
您不需要对象,只需定义自己的反向应用中缀运算符,大多数函数式语言都允许您这样做。然后休息做其余的。例如,在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)) *)
(或者选择您喜欢的任何运营商名称;其他人使用|>
作为例子。)