2017-07-08 60 views
1

ML族语言具有自动压缩功能 - 其中带有两个参数的函数调用被认为一次应用一个参数,f x y = (f x) y - 而其他语言族没有。为什么自动在ML家族语言中进行压缩

这仅仅是一次历史性的事故,还是有技术上的原因呢?

请注意,我是而不是问自动卷曲是净是好还是坏(这是一种主观判断)。我在问,它是否与ML家族语言的其他功能产生协同作用,从而使其更加自然地包含在这些语言中,如果是这样,这些功能是什么以及协同的性质是什么?或者相反,其他语言家族的特征是否会与任何提供自动卷曲的尝试冲突?

编辑:除了给出的答案之外,我觉得还有另外一个因素:如果编写的编译器是一种模式匹配的语言,AST可以更复杂,意味着传统的“使用元组调用”构造是一个复合词是没问题的。所以考虑到编译器通常是用自己的语言编写的,自动的卷曲和模式匹配很好地结合在一起。

回答

3

由于标准ML支持的元组(记录等)和模式匹配,它还支持 -currying型号:

fun add (x, y) = x + y 

所以咖喱功能只是一个选项,并为特别支持定义它们只是语法糖(尽管写作惯用的ML代码非常重要的语法糖)。没有理由认为像JavaScript语言不能提供相同的语法糖:

// Analogous to fun (f o g) x = f (g x) -- not actually valid JS: 
function compose(f)(g)(arg) { 
    return f(g(arg)); 
} 

但因为它是不那么常见的JavaScript函数立即返回的功能,这句法糖就不会那么有用那里。 (当然,这是有些循环的:一种语言中常见的东西是由语言变得容易形成的,一种语言使事情变得容易,因为它们在该语言中很常见。但是,所有语言功能都是如此,而不是特定于这一个。)

有趣的是,即使在标准ML,特殊咖喱功能语法只适用于功能声明fun ...),而不是功能表达式fn ...),所以我可以写

val op o = fn f => fn g => fn x => f (g x) 

但不是

val op o = fn f g x => f (g x)   (* illegal *) 

Haskell,相比之下,甚至功能表达式支持自动压缩;例如,(\ x y z -> x + y + z) 3 4 5评估为12。 (Haskell也认为咖喱在另一方面更加重要,即中缀操作员是咖喱的功能,与标准ML不同,在这种标准ML中,中缀操作员是需要一对的功能。)

3

这当然不是偶然的。例如,它简化了语言:不需要引入具有多个参数的函数作为单独的概念;每个函数都有一个参数。多个参数可以用元组或者用currying来表示。

第二,它是在实际中很方便,各种图案依赖于局部应用(例如,高阶函数,组合子库,等等)展示..

+0

“其一,它简化了语言:无需引入带有多个参数的函数作为一个单独的概念“ 当然,但是元组或currying都可以实现这一点。为什么都有?为什么不只是元组,因为你也希望那些用于数据结构? – munificent

+0

@功能性语言中的功能是一流的,所以其基础上的表现力已经存在。这个问题归结为是否提供一点点语法糖来方便*用curried风格编写函数定义。答案是,为什么不呢,因为支持和微不足道是很有用的(见第二点),而且更简洁一些。 –

+0

当然,我并没有声称添加糖是不值得的,但你之前的说法是,咖喱简化了语言,我认为这不是这种情况。一旦你有元组,你就不再需要currying来避免multi-arg fns的复杂性。柯里里只是一个很好的奖金。 – munificent

相关问题