我期望函数的这些定义使列表中的第二个元素相同
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 : [])).