Haskell - 一个无限的List,可以被给定List的每个数字整除

时间:2017-01-13 13:42:56

标签: list haskell

我仍然是Haskell的初学者,目前我正在尝试创建一个函数,在其中我生成一个无限列表,我(如果我使用以10为例)取第10个数字,可以被另一个列表整除给出了。

这是我的想法:

myCode :: [Int] -> [Int]
myCode (a:as) = [ x | x <- [0..] , x `mod` a == 0 , x `mod` myCode as ==0]

你可能已经注意到我试图通过递归来解决它,但是我总是得到错误&#34;无法将预期类型'Bool'与实际类型'[Int]'匹配#&# 34; 我有点不知所措,因为我不知道如何解决这个特殊问题。

1 个答案:

答案 0 :(得分:3)

此处无需使用递归:只需使用all(或any)作为条件:

alldiv :: [Int] -> Int -> Bool
alldiv l b = all (\n -> b `mod` n == 0) l

myCode :: [Int] -> [Int]
myCode as = [ x | x <- [0..] , alldiv as x]

您可以将alldiv重写为:

alldiv :: [Int] -> Int -> Bool
alldiv l b = all ((==) 0 . mod b) l

或甚至将其本地附加到myCode

myCode :: [Int] -> [Int]
myCode as = [ x | x <- [0..] , alldiv x]
    where alldiv b = all ((==) 0 . mod b) as

最后,您不需要列表理解,只需使用filter

myCode :: [Int] -> [Int]
myCode as = filter alldiv [0..]
    where alldiv b = all ((==) 0 . mod b) as

修改

由于列表中的一个元素是分隔符就足够了,您只需要将all替换为any