Haskell模式代码失败,出现错误“函数中的非详尽模式”

时间:2016-08-11 04:00:47

标签: haskell ghci

我正在使用ghci。我有一个简单的函数,它将列表中的每个元素都加倍。当我尝试模式匹配时,它是列表中的元素的两倍,但最终会失败并出现以下错误:

*Main> let double [] = []
*Main> let double (x:xs) = (2*x) : double xs
*Main> double [10,2,0,5]
[20,4,0,10*** Exception: <interactive>:52:5-37: Non-exhaustive patterns in function double

我使用防护和模式进行相同的功能。单独使用模式时不确定我做错了什么。请指教。

*Main> let double (x:xs) | null xs  = [2* x] | otherwise = (2*x) : (double xs)
*Main> double [10,2,0,5]
[20,4,0,10]

1 个答案:

答案 0 :(得分:7)

您的第二个let正在定义新的double。您可以像这样在GHCi中定义多行函数。

λ :{
| let
| double :: Num a => [a] -> [a]
| double [] = []
| double (x:xs) = 2 * x : double xs
| :}
λ double [1,2,3]
[2,4,6]

注意,这相当于map (2*)