【问题标题】:Haskell - an infinite List which is divisible by every number of a given ListHaskell - 一个无限列表,可以被给定列表的每个数字整除
【发布时间】:2017-01-13 22:20:33
【问题描述】:

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

这是我的想法:

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

您可能已经注意到,我正在尝试通过递归来解决它,但是我总是收到错误“无法将预期类型‘Bool’与实际类型‘[Int]’匹配” 我有点不知所措,因为我不知道如何解决这个特殊问题。

【问题讨论】:

  • 所以它们应该可以被给定列表中的所有元素整除?
  • 你希望这个递归完成什么?给出一些示例输出,该函数一旦工作就应该产生!
  • 抱歉,它们应该是所有可以被给定列表的任意数字整除的数字,例如取 5 (myCode[2,5]) 会得到列表 [2,4,5 ,6,8]

标签: list haskell


【解决方案1】:

这里不需要使用递归:只需使用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即可。

【讨论】:

  • 非常感谢您的帮助,但是在这种情况下,我正在寻找可以被任何一个数字整除的所有数字,而不是列表的所有数字,例如取 4 (myCode[2,3] ) 将是 [2,3,4,6] 抱歉没有足够清楚地指定
  • 但是通过你的评论我还是学到了很多我应该研究的功能:) 非常感谢
  • @HenrikBaumann:在这种情况下,您只需将 all 替换为 any
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多