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