我仍然是Haskell的初学者,目前我正在尝试创建一个函数,在该函数中,我生成一个无限列表,从该列表中,我(例如,如果我使用10)将前十个数字除以另一个列表,该列表是给定的。
这是我的主意:
myCode :: [Int] -> [Int]
myCode (a:as) = [ x | x <- [0..] , x `mod` a == 0 , x `mod` myCode as ==0]
您可能已经注意到,我正在尝试通过递归来解决它,但是我总是收到错误“无法将预期类型'Bool'与实际类型'[Int]'相匹配”“我有点不知所措,因为我不会知道如何解决这个特定问题。
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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句