对于项目欧拉问题#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]
答案 0 :(得分:1)
你走在正确的轨道上:
sumListTotals a b c = sum [a,a+a..c] + sum [b,b+b..c] - sum[m,m+m..c]
where m = ...???...
我会让你弄清楚m
的定义,因为那确实是一个数论问题而不是Haskell编程问题。
显然,a = 3, b = 5
m
应为15
。但m
应该a = 3, b = 3
应该是什么?