4

尝试创建一个将列表中的每个数字加一的 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 中的非详尽模式”

任何帮助将非常感激!

4

3 回答 3

11
add1_list_comp = map succ

这么简单

或者,以你的方式

add1_list_comp xs = [x + 1| x <- xs]

你的代码的问题是

add1_list_comp [x] 

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

于 2013-01-31T21:00:19.087 回答
6

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

(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)
于 2013-02-01T02:38:41.600 回答
1

实际上,由于主题声明“以一为增量”而没有定义将要以一为增量的类型,只是为了访问者最终来到这里,让我们给出一个解决方案,它将任何函子增加一,当然包括列表类型。所以;

列表函子

*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
于 2017-08-08T12:44:00.687 回答