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

use*_*280 4 haskell

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

let myFunction (a:(b:_)) = b
Run Code Online (Sandbox Code Playgroud)

let myFunction [a,b,_] = b
Run Code Online (Sandbox Code Playgroud)

...但是第二个不适用于无限列表

Prelude> let myFunction [a,b,_] = b
Prelude> myFunction [1..] 
*** Exception: <interactive>:8:5-26: Non-exhaustive patterns in function myFunction
Run Code Online (Sandbox Code Playgroud)

有什么不同?

编辑:也许[a,b,_]扩展到(a:(b:(_:[])))

Dav*_*vid 10

[x,_]只匹配与列表恰好两个元素.同样,[a,b,_]将任何列表与正好三个元素匹配,将第一个元素放入a,第二个元素放入b并丢弃第三个元素.(x:_)另一方面,将任何列表与至少一个元素匹配,将第一个元素放入x并丢弃其余元素.

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