Haskell 用自然数的平方、立方和因式生成序列

Haskell 用自然数的平方、立方和因式生成序列,haskell,Haskell,元素必须是唯一的,如何使用Haskell 我尝试了迭代和元组,但如何检查这个数字是否按顺序(迭代所有序列不是最佳决策:)。squares=map(^2)[1..] 多维数据集=映射(^3)[1..] 阶乘=scanl1(*)[1..] 合并(x:xs)(y:ys)| x==y=x:merge-xs-ys |x

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

我尝试了迭代和元组,但如何检查这个数字是否按顺序(迭代所有序列不是最佳决策:)。

squares=map(^2)[1..]
多维数据集=映射(^3)[1..]
阶乘=scanl1(*)[1..]
合并(x:xs)(y:ys)| x==y=x:merge-xs-ys
|x
由于每个序列都是按升序排列的,因此您可以编写一个
合并
函数来合并升序列表(或使用
ordlist
包中的函数)

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

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

foo = squares `merge` cubes `merge` factorials

我想你走错方向了!如果你想知道一个数字是否在序列中,你可以检查它是正方形、立方体还是阶乘,或者你可以生成所有的数字并检查它是否是一个成员(这似乎是你所建议的)。我会通过编写一些谓词,
isSquare
isCube
isFactorial
来实现这一点。我不想检查它是否在序列中,我想得到序列
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]