简单列表操作失败

时间:2013-03-31 15:45:12

标签: haskell

使用GHCi我执行以下操作:

prelude> let lol [] = []
prelude> let lol (x:xs) = (lol xs) ++ [x]

当我尝试评估时

prelude> lol [1, 2, 3]

我得到了

 Exception: <interactive>:3:5-32: Non-exhaustive patterns in function lol

我想我理解这个问题(1个元素的列表不匹配?)但是看不出为什么他不能将x:xs匹配为x:[]

2 个答案:

答案 0 :(得分:11)

prelude> let lol [] = []

定义了[a] -> [b]类型的函数,该函数在传递非空列表时将产生模式匹配失败。

然后将该定义视为阴影
prelude> let lol (x:xs) = (lol xs) ++ [x]
类型为[a] -> [a]

,当其参数为空列表时,将导致模式匹配失败。

let绑定不是增量的,名称的新绑定会影响旧绑定。

您可以通过用分号

分隔子句来定义具有多个子句的函数
let lol [] = []; lol (x:xs) = lol xs ++ [x]

答案 1 :(得分:5)

第二个let语句“覆盖”了第一个 - 就像在let中使用多个do一样 - 表示法。

您可以使用ghci的多行语法运算符:{:}

Prelude> :{
Prelude| let 
Prelude|   lol [] = []
Prelude|   lol (x:xs) = (lol xs) ++ [x]
Prelude| :}
Prelude> lol []
[]
Prelude> lol [1,2,3]
[3,2,1]