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