Haskell增加一个

Jus*_*ler 3 haskell

尝试创建一个Haskell程序,将列表中的每个数字递增1.

module Add1List where
add1_list_comp :: [Integer] -> [Integer]
add1_list_comp [x] = [x + 1| x <- [x]]
Run Code Online (Sandbox Code Playgroud)

当我打电话add1_list_comp [3]给它时它起作用......它给了我[4]

但是当我这样做时add1_list_comp [3, 4, 5]......它会让我错误地说出来

"函数add1_list_comp中的非穷举模式"

任何帮助将非常感激!

jde*_*lop 7

add1_list_comp = map succ
Run Code Online (Sandbox Code Playgroud)

那么简单

或者,以你的方式

add1_list_comp xs = [x + 1| x <- xs]
Run Code Online (Sandbox Code Playgroud)

你的代码的问题是

add1_list_comp [x] 
Run Code Online (Sandbox Code Playgroud)

列表上的模式与单个项目匹配,这就是为什么它在包含多个项目的列表上失败.

  • 这是一个'gimme teh codez answer'(好吧,好吧,你编辑的不再那么多了)......我认为如果答案进一步详细说明将要发生什么,对OP和未来的SO用户都会更有利.在这个解决方案中.请记住,尽管对你来说这可能是完全无足轻重的,但OP显然是一个初学者,可能需要明确指出并解释许多"明显"的事情. (3认同)

New*_*wyo 6

我看到问题已得到解答,但也许我可以再解释一下。函数的参数是模式匹配的,一般规则是

(x:xs) 
Run Code Online (Sandbox Code Playgroud)

x 是列表的头部, xs 是列表的尾部,可能是空列表

[]
Run Code Online (Sandbox Code Playgroud)

空列表

[x] or (x:[]) 
Run Code Online (Sandbox Code Playgroud)

是相同的,这是一个只有一个变量的列表

而一个没有构造函数的名字,如“[]”、“:”、“(,)”等可以匹配任何东西,所以如果你想匹配一个特例,你应该把特例放在通用模式的前面。

 length [] = 0
 length [x] = 1
 length (x : xs) = 1 + length xs
Run Code Online (Sandbox Code Playgroud)

顺便说一句,一般来说,当你想用列表做某事时,总会有一个高阶函数。对于你的情况

 add1 xs = map (+1) xs 
Run Code Online (Sandbox Code Playgroud)

更好,它利用了内置库,你也可以做一个免费版本

 add1 = map (+1)
Run Code Online (Sandbox Code Playgroud)