Haskell 函数调用中的括号

Brackets in Haskell function call

我很难记住调用 Haskell 函数时如何使用方括号。我来自 C 风格的背景,并且习惯了 f(comma, separated, args) 调用函数的语法。显然这与 (in Haskell) ((((f) comma) separated) args) 相同,但这只是令人困惑。

为什么我需要所有这些括号?

如果您习惯于 C 风格的函数调用语法,那么对于 C 风格的函数,例如

// defining the function
int plus(int a, int b)
{
    return a + b;
}

// elsewhere, calling the function
plus(a, b); // brackets surrounding only the arguments, comma separated

那么等效的 Haskell 代码将是

-- defining the function
plus :: Int -> Int -> Int
plus a b = a + b

-- elsewhere, calling the function:
(plus a b) -- brackets surrounding the function and the arguments, no commas

要使用您问题中的示例,

f(comma, separated, args);

这相当于

(f comma separated args)

但是这些括号不是必需的,除非有时函数调用嵌入到另一个表达式中。 在haskell中,这也等同于

((((f) comma) separated) args)

但是这些额外的括号也不是必需的,它们只是强调了 Haskell 处理函数应用程序的方式(其中每个函数 技术上 只接受一个参数);所以这个最后一个案例类似于下面的 c 函数调用:

f(comma)(separated)(args);

很容易记住Haskell中有关括号和函数调用的规则:没有,因为括号没有 与函数调用有关!

Haskell 中函数调用的基本语法是将术语并排书写:function argument 调用 function,传递它 argument。在类似 C 的语法中,您可以将其写为 function(argument)。您的 C 示例 f(comma, separated, args) 将在 Haskell 中写为 f comma separated args.

Haskell 仅在高中数学中使用括号:用于对子表达式进行分组,以便获得不同的调用结构。例如,在数学中 1 + 2 * 3 会在 2 和 3 上调用 *,在 1 和 * 调用的结果上调用 +(1 + 2) * 3 更改分组,以便在 1 和 2 上调用 +,在该结果和 3 上调用 *。同样有效的是 Haskell(和 C),其中相同的含义,但像这样的分组括号也可用于对具有普通函数而不是中缀运算符的表达式进行分组。例如 f comma separated args 在参数 commaseparatedargs 上调用 f,而 f comma (separated args) 表示调用 separated 传递它 args,并调用 f 传递它 comma 和调用 separated.

的结果

不需要((((f) comma) separated) args);事实上,当您使用 no 括号时,您会看到这是对 f comma separated args 如何被语言识别的解释。它将每个子表达式包装在显式括号中,因此可以毫不含糊地向您展示默认值,而不是说您实际上需要所有这些括号。