这似乎是更数学的方式
功能语言受lambda演算的启发。在此字段中,括号不用于函数应用。
我也认为后者的样式比没有括号的样式更清晰易读。
易读性是情人眼中的情人。您不习惯阅读它。它有点像数学运算符。如果您了解关联性,则只需几个括号即可阐明您的表达式的结构。通常,您不需要它们。
咖喱也是使用此约定的一个很好的理由。在haskell中,可以定义以下内容:
add :: Int -> Int -> Int
add x y = x + y
x = add 5 6 -- x == 11
f = add 5
y = f 6 -- y == 11
z = ((add 5) 6) -- explicit parentheses; z == 11
使用parens,可以使用两种约定:(f(5, 6)
非咖喱)或f(5)(6)
(咖喱)。haskell语法有助于习惯于currying概念。您仍然可以使用非咖喱版本,但与组合器一起使用会更痛苦
add' :: (Int, Int) -> Int
add' (x, y) = x + y
u = add'(5, 6) -- just like other languages
l = [1, 2, 3]
l1 = map (add 5) l -- [6, 7, 8]
l2 = map (\x -> add'(5, x)) l -- like other languages
请注意,第二个版本如何迫使您将x注册为变量,并且子表达式是一个接受整数并将其加5的函数?咖喱版本更轻巧,但也被许多人认为更易读。
Haskell程序大量使用部分应用程序和组合器作为定义和组合抽象的手段,因此,这不是一个玩具示例。一个好的功能界面将是一个参数顺序提供友好的咖喱用法的界面。
还有一点:没有参数的函数应该用调用f()
。在haskell中,由于仅操作不可变的惰性求值,因此您只需编写f
,并将其视为需要在必要时执行一些计算的值。由于其评估不会有任何副作用,因此对无参数函数及其返回值使用不同的表示法是没有意义的。
功能应用程序还有其他约定:
- Lisp:(fx)-带外部括号的前缀
- Forth:XF-后缀