Haskell创建数字列表

时间:2011-04-11 04:17:32

标签: list haskell

您好 我是Haskell的新手,希望编写一个简单的代码。 我想写一个创建数字列表的函数。 从1开始,以2n + 1和3n + 1增加 所以例如输出应该是 取6 myList = [1,3,4,7,9,10]

我想我需要使用递归但不知道该怎么做 它以列表格式。

任何帮助将不胜感激。感谢

3 个答案:

答案 0 :(得分:6)

实际上,我不确定我是否明白了。 但这是你想要的吗?

generator list = list ++ generator next
    where
    next = (map (\n -> 2 * n + 1) list) ++ (map (\n -> 3 * n + 1) list)

哦,你可以使用发电机[1]启动。像这样:

take 100 $ generator [1]

答案 1 :(得分:1)

merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) | x == y = x : merge xs ys
                    | x < y = x : merge xs (y:ys)
                    | otherwise = y : merge (x:xs) ys 

print $ take 10 $ merge [1,3..] [1,4..]
--[1,3,4,5,7,9,10,11,13,15]

答案 2 :(得分:1)

正如luqui所说,我们可以使用诸如重复事项之类的信息并确实有序。如果答案是否定,那么简单的concatMap工作正常:

myList = 1 : concatMap (\n -> 2*n+1 : 3*n+1 : []) myList

结果:

> take 20 myList
[1,3,4,7,10,9,13,15,22,21,31,19,28,27,40,31,46,45,67,43]

如果答案是肯定的,那么我认为它可能更清洁,但这已经足够了:

myList = abs
  where
  abs = merge as bs
  as = 1 : map (\n -> 2*n+1) abs
  bs = 1 : map (\n -> 3*n+1) abs
  merge (x:xs) (y:ys)
        | x == y = x : merge xs ys
        | x < y  = x : merge xs (y:ys)
        | otherwise = y : merge (x:xs) ys

结果:

> take 20 myList
[1,3,4,7,9,10,13,15,19,21,22,27,28,31,39,40,43,45,46,55]