项目Euler:Haskell实现中的#1

时间:2013-04-25 01:16:17

标签: haskell

对于项目欧拉问题#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]

1 个答案:

答案 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应该是什么?