我一直试图在我的编程中采用函数式语言。我使用C#并严重依赖LINQ和其他功能结构。目前我专注于榆树。
一件令我烦恼的事情是功能缺乏括号。数学表达式使用它们:
f(z) = ln(z) + 1
然而在许多功能语言中,这写成:
f z = ln z + 1
这只是一种风格,还是有更深层次的东西?
答案 0 :(得分:3)
功能语言在lambda calculus中生根,它不使用括号进行功能应用。
这是一个合法的东西,但是函数的应用方式是有道理的,因为带有两个参数的函数首先将最左边的参数应用于函数并输出第二个参数使用的函数,所以将括号括起来是有意义的。 。例如,您习惯的功能:
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)
。
答案 1 :(得分:3)
在函数应用程序中避免括号的一个原因是currying。
如果你编码f x y
(就像你应该在Ocaml中那样),那么f x
只是一个curryfication。如果你没有这样的表示法,你需要一个明确的lambda(或一些anonymous function表示法),就像在Scheme (lambda (y) (f x y))
另一方面,带有currying的语言经常隐含地将f x y
解释为(f x) y
,然后他们的实现需要优化它以避免创建无用的临时closures。
我的感情很复杂。钻营。它可能并不经常有用(但有时你会需要它),短匿名函数符号也许就足够了
答案 2 :(得分:-1)
我们看到的很多符号都影响了我的数学,我在数学中看到了至少两种函数符号来显示域到域的映射。
f(x)= x + 1且x - > x + 1
所以我想也许没有括号的语言可能来自后面的