我希望获取列表中第二个元素的函数的这些定义是相同的

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/

10-16 06:56