我仍然是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; 我有点不知所措,因为我不知道如何解决这个特殊问题。
答案 0 :(得分:3)
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
。