Haskell增加一个

时间:2013-01-31 20:56:59

标签: haskell

尝试创建一个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中的非详尽模式”

任何帮助将不胜感激!

3 个答案:

答案 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