在Haskell中,我知道有元组(x1,x2,x3)
并列出[x1,x2,x3]
,并且元组不是同质的并且具有固定的长度。
另一方面,列表可以重写为例如x1:x2:x3:[]
形式,我猜这是一个函数a ->[a]->[a]
,这对我来说很有意义,但是在下面的代码中:
head' :: [a] -> a
head' [] = error
head' (x:_) = x
我不清楚为什么我们使用括号,这是我理解的元组符号。它看起来更像是我们应该在冒号操作符上有类似uncurry函数的东西,并采取第一个输入,或类似的东西。
括号如何在这里表现,为什么我们不能以某种方式使用括号?
答案 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'
的列表中有多少元素。