生成具有正方形,立方体和自然数的阶乘的序列

时间:2012-03-22 12:00:40

标签: haskell

元素必须是唯一的,我如何使用Haskell

我尝试使用迭代元组并且它可以工作,但我如何检查这个数字是否顺序(通过所有序列迭代不是最佳决策:)。

2 个答案:

答案 0 :(得分:8)

由于每个序列都是按升序排列,因此您可以编写merge函数来合并升序列表(或使用ordlist包中的列表)。

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

然后,您可以通过将其他序列合并在一起来定义最终序列:

squares = map (^2) [1..]
cubes = map (^3) [1..]
factorials = scanl1 (*) [1..]

foo = squares `merge` cubes `merge` factorials
> take 20 foo
[1,2,4,6,8,9,16,24,25,27,36,49,64,81,100,120,121,125,144,169]

答案 1 :(得分:3)

squares = map (^2) [1..]
cubes = map (^3) [1..]
factorials = scanl1 (*) [1..]

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 $ factorials `merge` squares `merge` cubes
--[1,2,4,6,8,9,16,24,25,27,36,49,64,81,100,120,121,125,144,169]