Haw*_*ins 1 recursion haskell list
我是函数式编程和haskell的新手,所以我只是通过尝试一些Euler问题开始学习.这涉及大量的列表总结.
所以我正在尝试编写一个递归列表求和函数,它将一个列表作为输入并返回一个整数作为输出,例如:
-- Sum up a list
listsum :: [int] -> int
listsum [a:b:[]] = a + b
listsum x = head x + listsum tail x
Run Code Online (Sandbox Code Playgroud)
编译此代码时,我收到此错误:
Couldn't match expected type `[[int] -> int]'
with actual type `[a0] -> [a0]'
Relevant bindings include
x :: [int]
(bound at C:\Users\Rade\Documents\GitHub\haskell\euler_2.hs:15:9)
listsum :: [int] -> int
(bound at C:\Users\Rade\Documents\GitHub\haskell\euler_2.hs:14:1)
Probable cause: `tail' is applied to too few arguments
In the first argument of `listsum', namely `tail'
In the second argument of `(+)', namely `listsum tail x'
Run Code Online (Sandbox Code Playgroud)
我试图研究模式匹配,但我无法理解预期类型与实际类型的含义.我哪里错了?
listsum [a:b:[]] = a + b
Run Code Online (Sandbox Code Playgroud)
在这里,a:b:[]意味着列表[a, b],所以[a:b:[]]意味着[[a, b]],这不是你想要的.
只需将其更改为
listsum (a:b:[]) = a + b
Run Code Online (Sandbox Code Playgroud)
现在,在
listsum x = head x + listsum tail x
Run Code Online (Sandbox Code Playgroud)
部分listsum tail x表示适用listsum于tail,然后将结果应用于x.我想你的意思是适用tail于x,然后应用listsum到结果,它可以表示为listsum (tail x).
我建议一个更清洁的实现,它假设空列表的总和为零.
listsum [] = 0
listsum (x:t) = x + listsum t
Run Code Online (Sandbox Code Playgroud)
这与您的实现的功能不同,因为它正确处理零或一个元素的列表.
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |