我正在学习haskell,然后我参加了这个练习,我必须定义一个能够得到数字列表产品的函数。我被提供了选择,因为我是haskell的新手,有一些我不太清楚的符号。
所以我在其中一个选择中看到了这个定义:
p [x, xs] = x * product xs
我可以理解这一点,这意味着获取列表的乘积,然后将其乘以x的值。
然后我在另一个选择中看到了另一个定义:
p (x : xs) = x * product xs
我完全不明白。它使用括号和冒号,我很难找到它们的定义。如果有人可以通过语法和语义来启发我,我感激不尽。
答案 0 :(得分:5)
[x, xs]
是一个包含两个元素的列表。第一个元素称为x
,第二个元素称为xs
。因此,在这种情况下product xs
不计算列表的乘积,它计算第二个元素的乘积。由于列表中的元素本身不是列表(或者乘以x不会起作用),这是一个类型错误。
x : xs
是一个包含至少一个元素的列表。它的第一个元素称为x
,包含其余元素的列表称为xs
。
答案 1 :(得分:4)
:
是cons运算符,它将一个元素附加到列表
(x : xs)
将列表匹配到元素x
和列表的其余部分xs
让我们举一个具体的例子:
l = [1,2,3]
show_rest_of_list (x:xs) = xs
show_rest_of_list l
-- would return [2,3]
play_with_list (x:xs) = x : x : xs
play_with_list l
-- would return [1,1,2,3]