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