尝试创建一个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中的非穷举模式"
任何帮助将非常感激!
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)
列表上的模式与单个项目匹配,这就是为什么它在包含多个项目的列表上失败.
我看到问题已得到解答,但也许我可以再解释一下。函数的参数是模式匹配的,一般规则是
(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)
| 归档时间: |
|
| 查看次数: |
7071 次 |
| 最近记录: |