模式与[x,_]语法匹配vs(x:_)用于haskell中的无限列表

时间:2014-08-18 03:07:58

标签: haskell

我期望函数的这些定义使列表中的第二个元素相同

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:(_:[])))

1 个答案:

答案 0 :(得分:10)

[x,_]仅匹配完全两个元素的列表。同样地,[a,b,_]匹配任何具有三个元素的列表,将第一个元素放在a中,将第二个元素放在b中并丢弃第三个元素。另一方面,(x:_)匹配任何带有至少一个元素的列表,将第一个元素放在x中并丢弃其余元素。

(:)是列表构造函数。所有非空列表都由对(:)的调用组成。请注意,[a,b,c]a : (b : (c : []))的语法糖。