对于 Project Euler 问题 #1,GHCI 中最短的单行代码是:
sum [3,6..9999] + sum [5,10..9999] - sum [15,30..9999]
解决问题后我发现这是一个非常血腥的方式。但是,由于我是 Haskell 的新手,我决定看看我是否可以把它放在一起作为一组函数返回类似的答案 x 的任何值(步长值,即上面的 '3' 或 '5'] 和y(列表的长度)。
我在这里完成了第一个功能:
sumList :: (Enum a, Num a) => a -> a -> a
sumList a b = sum[a,a+a..b]
接下来我试图利用这个功能并做一些事情sumListTotals [3,5] 1000
,例如从问题中。这将全部sumList
用于列表中的每个项目,然后减去重复的数字(即 [15,30..1000] 使用示例。
我不是在寻找真正解决它的人,而是帮助我指出正确的方向。
我试图使用如下map
功能:
sumListTotals list = map f list
where f = sumlist a b
但是,我不确定如何从列表中取出这些东西,或者我是否做了类似的事情,sumListTotals ([3,5],1000)
或者我完全走错了路?
根据@user5402 更新:
module Project1 where
import Data.List (union)
sumListTotals :: (Enum a, Eq a, Num a) => a -> a -> a -> a
sumListTotals a b c = sum $ union [a,(*2)a..c] [b,(*2)b..c]