Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List haskell列表语法中的冒号与方括号_List_Haskell_Syntax - Fatal编程技术网

List haskell列表语法中的冒号与方括号

List haskell列表语法中的冒号与方括号,list,haskell,syntax,List,Haskell,Syntax,我现在正在学习haskell,然后我来做这个练习,我必须定义一个函数,它可以得到一系列数字的乘积。我有很多选择,因为我是哈斯凯尔的新手,所以有些符号我不太清楚 所以我在其中一个选项上看到了这个定义: p [x, xs] = x * product xs 我能理解这一点,它意味着得到列表的乘积,然后乘以x的值 然后我在另一个选择中看到了另一个定义: p (x : xs) = x * product xs 我完全不明白。它使用括号和冒号,我很难找到它们的定义。如果有人能在语法和语义方面给我一些启

我现在正在学习haskell,然后我来做这个练习,我必须定义一个函数,它可以得到一系列数字的乘积。我有很多选择,因为我是哈斯凯尔的新手,所以有些符号我不太清楚

所以我在其中一个选项上看到了这个定义:

p [x, xs] = x * product xs
我能理解这一点,它意味着得到列表的乘积,然后乘以x的值

然后我在另一个选择中看到了另一个定义:

p (x : xs) = x * product xs

我完全不明白。它使用括号和冒号,我很难找到它们的定义。如果有人能在语法和语义方面给我一些启发,我将不胜感激。

是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]

是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]

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


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

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


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

需要记住的是,语法
[x,y,z]
x:y:z:[]
的“语法糖”。事实上,列表的定义看起来非常像
data[]a=[]|a:([]a)
是数据类型
[a]
的构造函数,您只需在构造函数上进行模式匹配。因为我们是程序员,喜欢编写类似于
[1,2,3]
的列表,而不是
1:2:3:[]
,所以编译器有特殊的规则将前者转换为后者。当您看到形式为
(x:xs)
的模式时,请记住这一点。第一个示例看起来确实不应该进行类型检查…@我自己:不,它可能会进行类型检查,因为有人可以编写
实例Num[]
…需要记住的是语法
[x,y,z]
是“语法糖”对于
x:y:z:[]
。事实上,列表的定义看起来非常像
data[]a=[]|a:([]a)
是数据类型
[a]
的构造函数,您只需在构造函数上进行模式匹配。因为我们是程序员,喜欢编写类似于
[1,2,3]
的列表,而不是
1:2:3:[]
,所以编译器有特殊的规则将前者转换为后者。当您看到形式为
(x:xs)
的模式时,请记住这一点。第一个示例看起来真的不应该进行类型检查…@我自己:不,它可能会进行类型检查,因为有人可以编写
实例Num[]
…有趣的是,这个示例让我更好地理解。我得在我的电脑里试试这个有趣的是,这个例子让我更了解。我得在我的ghci里试试