我期望函数的这些定义使列表中的第二个元素相同
let myFunction (a:(b:_)) = b
let myFunction [a,b,_] = b
...但第二个不适用于无限列表
Prelude> let myFunction [a,b,_] = b
Prelude> myFunction [1..]
*** Exception: <interactive>:8:5-26: Non-exhaustive patterns in function myFunction
有什么区别?
修改:可能[a,b,_]
扩展为(a:(b:(_:[])))
?
答案 0 :(得分:10)
[x,_]
仅匹配完全两个元素的列表。同样地,[a,b,_]
匹配任何具有三个元素的列表,将第一个元素放在a
中,将第二个元素放在b
中并丢弃第三个元素。另一方面,(x:_)
匹配任何带有至少一个元素的列表,将第一个元素放在x
中并丢弃其余元素。
(:)
是列表构造函数。所有非空列表都由对(:)
的调用组成。请注意,[a,b,c]
是a : (b : (c : []))
的语法糖。