2014-10-16 139 views
0

我目前正在学习haskell,然后我来到这个练习中,我必须定义一个函数来获取数字列表的结果。我被提供了选择,并且因为我是哈斯克尔的新手,所以有一些符号我有点不清楚。冒号与括号中的haskell列表语法

所以我看到的选择一个这样的定义:

p [x, xs] = x * product xs 

我能理解这个相当多,就意味着拿到名单的产物,然后用x的值相乘。

然后我看到了其他的选择之一这个其他的定义:

p (x : xs) = x * product xs 

我完全不明白。它使用括号和冒号,我很难找到它们的定义。我很感激有人可以在语法和语义方面给我启发。

+3

需要注意的是,语法'[x,y,z]'是'x:y:z:[]'的语法糖。实际上,列表的定义看起来非常像'data [] a = [] | a:([] a)'。 ':'是数据类型'[a]'的构造函数,你只是在构造函数上进行模式匹配。因为我们是程序员,并且喜欢用'[1,2,3]'而不是'1:2:3:[]'来编写列表,所以编译器有特殊的规则来将前者变成后者。当你看到'(x:xs)'形式的模式时,记住这一点。 – bheklilr 2014-10-16 15:05:30

+2

第一个例子看起来不像它应该类型检查... – MathematicalOrchid 2014-10-16 15:54:45

+1

@自己:不,它可能是类型检查,因为有人可以编写'实例Num []'... – MathematicalOrchid 2014-10-16 16:39:49

回答

2

:是利弊经营者,其中一个元素追加到列表

(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] 
+0

有趣的是,这个例子让我明白更好。我必须在我的ghci中试试这个 – it2051229 2014-10-16 15:22:28

3

[x, xs]是一个包含两个元素的列表。第一个元素称为x,第二个元素称为xs。所以在这种情况下,product xs不计算列表的乘积,它计算第二个元素的乘积。由于列表中的元素不能是列表本身(否则与x相乘将不起作用),这是一种类型错误。

x : xs是一个包含至少一个元素的列表。其第一个元素叫做x,包含其余元素的列表被称为xs