haskell中的匹配数序列

haskell中的匹配数序列,haskell,numbers,sequence,Haskell,Numbers,Sequence,我的任务是匹配Haskell列表中数字5、7和9的数字序列。列表必须是无限的,以便可以执行以下操作: 以10为例 [5,7,9,10,14,15,18,20,21,25] 我已经知道如何创建一个由单个数字组成的无限序列列表: sevens :: [Int] sevens = sevens : (map (+7) sevens) 这是可行的,但我如何使用多个数字(本例中为5、7和9)来实现这一点 谢谢你的帮助:)明白了。。几乎 seq :: [Int]->[Int] seq

我的任务是匹配Haskell列表中数字5、7和9的数字序列。列表必须是无限的,以便可以执行以下操作:

以10为例 [5,7,9,10,14,15,18,20,21,25]

我已经知道如何创建一个由单个数字组成的无限序列列表:

    sevens :: [Int]
    sevens = sevens : (map (+7) sevens)
这是可行的,但我如何使用多个数字(本例中为5、7和9)来实现这一点

谢谢你的帮助:)

明白了。。几乎

seq :: [Int]->[Int]
seq (x:xs) if (mod x 5 == 0 || mod x 7 == 0 || mod x 9 == 0) then (x: seq xs) 
     else (seq xs)
但stll必须输入自然数列表,才能工作。没有任何输入就可以吗?

这个怎么样

multiples_of_any_of :: [Int] -> [Int] 
multiples_of_any_of base = filter (\x -> any (\b -> 0 == mod x b) base ) [1..]

answer::[Int]    
answer = multiples_of_any_of [5,7,9]    
我将主函数保留为一般形式,因此它可以用于获取任意倍数的数字组合,而不仅仅是
[5,7,9]
,并且作为其定义的一部分,它包括
[1..]
形式的自然数。最后,答案就像上面显示的一样简单

例子

*Main> take 30 answer 
[5,7,9,10,14,15,18,20,21,25,27,28,30,35,36,40,42,45,49,50,54,55,56,60,63,65,70,72,75,77]
(0.00 secs, 0 bytes)
*Main> 
*Main> take 10 (multiples_of_any_of [5,13,23])
[5,10,13,15,20,23,25,26,30,35]
(0.00 secs, 933980 bytes)
*Main> 

前面的答案要好得多,但这里有一个蛮力方法,遵循您的思路

merge :: [[Integer]] -> [Integer]
merge all@[(a:as), (b:bs), (c:cs)] = let min = minimum [a, b, c]
    in min : (merge (map (dropMin min) all))
    where dropMin m (x:xs)
            | x == m    = xs
            | otherwise = (x:xs)

> take 15 $ merge [[5, 10 .. ], [7, 14 ..], [9, 18 ..]] 
[5,7,9,10,14,15,18,20,21,25,27,28,30,35,36]