尝试创建一个Haskell程序,将列表中的每个数字递增一个。
module Add1List where
add1_list_comp :: [Integer] -> [Integer]
add1_list_comp [x] = [x + 1| x <- [x]]
当我调用此add1_list_comp [3]
时,它会有效...它会给我[4]
但当我做add1_list_comp [3, 4, 5]
时...它会引发一个错误说
“函数add1_list_comp中的非详尽模式”
任何帮助将不胜感激!
答案 0 :(得分:7)
add1_list_comp = map succ
那么简单
或者,以你的方式
add1_list_comp xs = [x + 1| x <- xs]
您的代码存在的问题是
add1_list_comp [x]
将列表上的模式匹配与单个项目进行匹配,这就是它在具有多个项目的列表上失败的原因。
答案 1 :(得分:4)
我看到问题已得到解答,但也许我可以解释一下。 函数的参数是模式匹配的,一般规则是
(x:xs)
x是列表的头部,xs是列表的尾部,可能是空列表
[]
空列表
[x] or (x:[])
是相同的,只有一个变量的列表
并且没有诸如“[]”,“:”,“(,)”等构造函数的名称可以匹配任何内容,因此如果要匹配特殊情况,则应将特殊情况放在前面。一般模式。
length [] = 0
length [x] = 1
length (x : xs) = 1 + length xs
顺便说一下,一般来说,当你想对列表做某事时总会有一个更高阶的函数。为你的情况
add1 xs = map (+1) xs
更好,它利用了内置的库,你也可以做一个免费的版本
add1 = map (+1)
答案 2 :(得分:0)
实际上,因为主题是“增加一个”而没有定义什么类型将增加一个,只是为了访问者最终在这里让我们给出一个解决方案,将任何仿函数增加一个,哪个课程包括列表类型。所以;
列出仿函数
*Main> fmap (+1) [1,2,3]
[2,3,4]
也许是仿函数(id
适用于Nothing
)
*Main> fmap (+1) (Just 1)
Just 2
任何一个仿函数(id
都适用于Left _
)
*Main> fmap (+1) (Right 2)
Right 3
IO仿函数
*Main> fmap ((+1) . read) getLine
2017
2018