我目前正在学习haskell,然后我来到这个练习中,我必须定义一个函数来获取数字列表的结果。我被提供了选择,并且因为我是哈斯克尔的新手,所以有一些符号我有点不清楚。冒号与括号中的haskell列表语法
所以我看到的选择一个这样的定义:
p [x, xs] = x * product xs
我能理解这个相当多,就意味着拿到名单的产物,然后用x的值相乘。
然后我看到了其他的选择之一这个其他的定义:
p (x : xs) = x * product xs
我完全不明白。它使用括号和冒号,我很难找到它们的定义。我很感激有人可以在语法和语义方面给我启发。
需要注意的是,语法'[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
第一个例子看起来不像它应该类型检查... – MathematicalOrchid 2014-10-16 15:54:45
@自己:不,它可能是类型检查,因为有人可以编写'实例Num []'... – MathematicalOrchid 2014-10-16 16:39:49