将括号与括号区分开来

时间:2018-03-20 17:17:31

标签: haskell

在Haskell中,我知道有元组(x1,x2,x3)并列出[x1,x2,x3],并且元组不是同质的并且具有固定的长度。

另一方面,列表可以重写为例如x1:x2:x3:[]形式,我猜这是一个函数a ->[a]->[a],这对我来说很有意义,但是在下面的代码中:

head' :: [a] -> a  
head' [] = error   
head' (x:_) = x  

我不清楚为什么我们使用括号,这是我理解的元组符号。它看起来更像是我们应该在冒号操作符上有类似uncurry函数的东西,并采取第一个输入,或类似的东西。

括号如何在这里表现,为什么我们不能以某种方式使用括号?

2 个答案:

答案 0 :(得分:4)

括号表示包含逗号的元组。没有逗号的括号用于分组,例如区分x - (y - z)(x - y) - z,或者在这种情况下,区分head' (x:_) = x(head' x) : _ = x。换句话说,括号在此处所做的只是表示:正在应用于x_而不是head' x_

如果你在这里使用[],那将是一个列表模式。通常,如果给定值是具有一个元素的列表并且该元素与模式[p]匹配,则模式p匹配。因此[x:_]匹配包含一个元素的列表,该元素本身就是与模式x:_匹配的列表。由于这不是你想要的,你需要使用没有列表模式的版本。

答案 1 :(得分:3)

head' (x:_)中的括号仅用于分组;你可以告诉没有涉及元组,因为里面没有逗号。如果没有括号,head' x:_将被解析为(head' x):_,它不会在作业的左侧工作。

我们无法在此处使用括号,因为它们需要知道传递给head'的列表中有多少元素。