为什么一些函数式编程语言不使用括号表示函数参数?

5

我一直在尝试将函数式语言引入我的编程中。我使用C#,并且大量依赖于LINQ和其他函数式结构。目前我正在专注于Elm。

有一件事情仍然困扰着我,那就是函数中缺少括号。数学表达式使用它们:

f(z) = ln(z) + 1

然而在许多函数式编程语言中,这被写成:

f z = ln z + 1

这仅仅是一个样式问题还是有更深层次的东西在这里发生了?

虽然在像Haskell这样的柯里化语言中不使用括号确实很有趣,而且肯定有一些情况不需要使用括号,但我真的想说这在很大程度上是语法设计者的“基于观点”的问题。反对意见应该说明缺少括号如何(或可以)对某些函数式编程概念有益。另一方面,LISP方言(具有各种程度的“函数式编程”)则无法没有括号存在。 - user2864740
1
我不确定你为什么说“一些”.. 你有Fortran及其方言(Algol、Basic、C、pyhon、perl、java、C#、pascal等)使用f(arg ...),然后你有Lisp方言(Scheme、Common Lisp、Arc)使用(f arg ...),我们有SASL方言(Haskell)使用f arg: args =。我错过了什么吗?所有使用f(arg)不同语言在哪里,或者我们只谈论基于Fortran的方言 - Sylwester
@sylwester,将“some”(任意数量)与“all”或“many”或“most”进行对比。如有需要,可以编辑标题以改进它。 - user2864740
3个回答

4

函数式语言起源于lambda演算,它不使用括号进行函数应用。

这是一种语法上的问题,但是由于函数应用的方式,省略括号是有道理的,因为一个带有两个参数的函数首先将最左边的参数应用于该函数,并输出一个由第二个参数使用的函数。例如,您习惯使用的函数:

add(x,y) { return x + y } 

在功能方面是
add x y
add :: Int->Int->Int

应用x后的中间步骤返回另一个函数。
add 4  -- returns a function that will return 4 + y, when y is applied
add 4 :: Int->Int

在一定程度上,这有助于避免您所熟悉的编程语言中出现 add(4) 抛出错误的混淆。它更像是具有结合性的数学表达式,((add x) y)

这很合理。不知道为什么我错过了函数应用的概念。显然,我一直在考虑函数如何接受参数而不是应用参数。 - Mike Ward

4
避免在函数应用中使用括号的原因之一是柯里化
如果你像在Ocaml中那样编码f x y,那么f x就是一个简单的柯里化。如果你没有这样的符号表示,你需要一个显式的lambda(或一些匿名函数符号),比如在Scheme中(lambda (y) (f x y)) 另一方面,具有柯里化功能的语言通常会隐式地将f x y解释为(f x) y,然后它们的实现需要优化以避免创建无用的临时闭包我对柯里化有复杂的感觉。它可能不经常使用(但有时你需要它),而一个的匿名函数符号可能就足够了。

-1

我们看到的很多符号都受到数学的影响,我至少见过两种在数学中用于表示定义域到值域映射的函数符号。

f(x) = x + 1 和 x -> x + 1

所以我猜没有括号的编程语言可能是从后者演变而来的。


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