我希望获取列表中第二个元素的函数的这些定义是相同的
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:(_:[])))
? 最佳答案
[x,_]
只匹配正好有两个元素的列表。同样, [a,b,_]
匹配任何正好包含三个元素的列表,将第一个元素放入 a
,将第二个元素放入 b
并丢弃第三个元素。另一方面,(x:_)
匹配具有至少一个元素的任何列表,将第一个元素放入 x
并丢弃其余元素。(:)
是列表构造函数。所有非空列表都由对 (:)
的调用组成。请注意, [a,b,c]
是 a : (b : (c : []))
的语法糖。
关于haskell - [x,_] 语法与 (x :_) for infinite lists in haskell,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25355818/