5

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

4

2 回答 2

11
prelude> let lol [] = []

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

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

type [a] -> [a],当其参数为空列表时将导致模式匹配失败。

let绑定不是增量的,名称的新绑定会隐藏旧绑定。

您可以通过用分号分隔子句来定义具有多个子句的函数,

let lol [] = []; lol (x:xs) = lol xs ++ [x]
于 2013-03-31T15:48:56.890 回答
5

第二个let语句“覆盖”了第一个 - 就像您在-notation中使用多个lets一样。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]
于 2013-03-31T16:48:07.607 回答