我们是否必须在函数声明中使用模式匹配中的括号?
在下面的示例中,我有一个模式x:xs
,其中x
从列表中获取第一个元素并xs
包含其余元素.
我想问一下括号是否是这种模式匹配的必要部分.
head' :: [a] -> a head' [] = error "Can't call head on an empty list!" head' (x:_) = x
我尝试使用它没有大括号,但它在加载到ghci期间导致错误.
括号不是模式匹配的一部分,同样意义上它们不是表达式评估的一部分.话虽这么说,括号肯定是模式和表达式语法的一部分.
看,如果你写
h x:xs
这看起来像
(h x) : xs
到解析器.因此我们写
h (x:xs)
在等号的左手侧和右手侧.作为表达式,它表示"函数h应用于由x和xs构成的列表",并且在左侧它定义了该应用程序的等式.