Haskell,如何从无限列表中计算除法器?

时间:2019-01-13 14:12:14

标签: haskell

如何编写接收列表的函数,例如[7, 8, 9]

该函数在无限列表内。它将从无限列表中计算所有除数。

例如take 5 (f [7, 8, 9])的输出将为[7, 8, 9, 14, 16]

第二个示例take 7 (f [7, 8, 9])的输出为[7, 8, 9, 14, 16, 18, 21]

希望您能理解我的意思。

我的代码如下:

myFunction list = [x | x <- [1..], el <-[list], x `mod` el == 0]

我的代码仅适用于常量列表。如果我写

myFunction list = [x | x <- [1..], el <-[7, 8], x `mod` el == 0]

它仅适用于7和8

如何传递任意列表?

1 个答案:

答案 0 :(得分:4)

首先让我们解决单个项目而不是列表的情况:

multiples n | n > 0 = [n * i | i <- [1..]]

那很容易。现在假设我们有multiples 2multiples 3,如何计算multiples [2,3],即由2或3的倍数组成的递增数字序列,或者换句话说,由是在数字multiples 2multiples 3中递增的数字?试试这个:

merge (x:xs) (y:ys) = case compare x y of
  GT -> y : merge (x:xs) ys
  LT -> x : merge xs (y:ys)
  EQ -> x : merge xs ys

现在我们可以实现所需的功能:

f (x:xs) = foldr merge (multiples x) (multiples <$> xs)