使用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:[]
答案 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]