有什么问题 - 如果有的话 - 使用以下Haskell代码?

时间:2017-04-21 16:56:37

标签: haskell

项目欧拉问题:1 注意:GHCi实现:type' main'输出结果

3和5的倍数

问题: 如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23。

查找低于1000的3或5的所有倍数的总和。

-- all multiples of 3 less than 1000
multOfThree = [3*x | x <- [1..333] ]

-- all multiples of 5 less than 1000
multOfFive = [5*x | x <- [1..199] ]

-- common values of the two lists
commonValues = [x | x <- multOfThree, x <- multOfFive]

-- list of all multiples, subtract commonValues (as there are two copies - one per list)
multiplesOfThreeOrFive = (multOfThree ++ multOfFive) -- commonValues

sumOfMultiples = sum multiplesOfThreeOrFive

-- display sum:
main = print sumOfMultiples

1 个答案:

答案 0 :(得分:1)

有两件事情不按你的意图行事:

列表减法

要对列表使用设置差异,请使用\\中的Data.List--实际上开始发表评论。

import Data.List ((\\))
multiplesOfThreeOrFive = (multOfThree ++ multOfFive) \\ commonValues

或跳过commonValues并使用Data.List.union

列表理解

commonValues = [x | x <- multOfThree, x <- multOfFive]

不幸的是,你无法翻译常用的数学符号并将''''''符号转换为<-。原因是,它只是“共同的”,而不是正式的数学:第一个<-意味着迭代第一个集合,第二个是谓词(条件)。您可以直接将其写为

commonValues = [x | x <- multOfThree, x `elem` multOfFive]

如chi所述。

说明

这些是“产生错误结果”的错误。在related code review question中,您将获得进一步的建议。