如何在haskell中使用下面的方法获得无穷多的能力列表

如何在haskell中使用下面的方法获得无穷多的能力列表,haskell,Haskell,我一直在尝试做一个无穷幂的列表,就像我在下面做的一样,一个斐波那契数和阶乘的列表 fibs = 0 : 1 : zipWith (+) fibs (tail fibs) facs = 1 : zipWith (*) [1 ..] facs 谢谢我想你可以用一个列表来定义一个无限的正方形序列: powers = [ ii*ii | ii <- [1 ..]] take 10 powers => [1,4,9,16,25,36,49,64,81,100] powersOf2 =

我一直在尝试做一个无穷幂的列表,就像我在下面做的一样,一个斐波那契数和阶乘的列表

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

facs = 1 : zipWith (*) [1 ..] facs

谢谢

我想你可以用一个列表来定义一个无限的正方形序列:

powers = [ ii*ii | ii <- [1 ..]]

take 10 powers
=> [1,4,9,16,25,36,49,64,81,100]
powersOf2 = [ 2^ii | ii <- [0 ..]]
take 10 powersOf2
=> [1,2,4,8,16,32,64,128,256,512]
powers=[ii*ii | ii[1,4,9,16,25,36,49,64,81100]
编辑:有人解释说你在追求2的力量,这也可以通过列表理解来实现:

powers = [ ii*ii | ii <- [1 ..]]

take 10 powers
=> [1,4,9,16,25,36,49,64,81,100]
powersOf2 = [ 2^ii | ii <- [0 ..]]
take 10 powersOf2
=> [1,2,4,8,16,32,64,128,256,512]
powerso2=[2^ii | ii[1,2,4,8,16,32,64128256512]
您可以将其外推到任意给定基的生成器函数:

powersOfN nn = [ nn^ii | ii <- [0 ..]]

take 10 (powersOfN 3)
=> [1,3,9,27,81,243,729,2187,6561,19683]

take 10 (powersOfN 17)
=> [1,17,289,4913,83521,1419857,24137569,410338673,6975757441,118587876497]
powersOfN nn=[nn^ii | ii[1,3,9,27,812437292187656119683]
第10次(第17次)
=> [1,17,289,4913,83521,1419857,24137569,410338673,6975757441,118587876497]

生成数字的幂和使用“迭代”一样简单:

iterate (*2) 1
要查找特定的幂(而不是列出它们),使用
(^)
会更快。要查看大乘法的各个步骤,可以使用
scanl

scanl (*) 1 [2, 3, 5, 7]
最后,要生成所有正方形的列表,我建议采用以下方法:

fix (\more r s -> s : more (r + 1) (s + 2*r + 1)) 0 0
或者,如果您对
fix
不满意,这里有两个替代版本:

unfoldr (\(r, s) -> Just (s, (r + 1, s + 2*r + 1))) (0, 0)

map snd . iterate (\(r, s) -> (r + 1, s + 2*r + 1)) $ (0, 0)

为了提高可读性,您还可以使用
map

连续两次权力清单:

λ> map (2^) [0..10]
[1,2,4,8,16,32,64,128,256,512,1024]
连续正方形:

λ> map (^2) [0..10]
[0,1,4,9,16,25,36,49,64,81,100]

如果您希望通过zipWith获得无穷大的幂N列表,这可能是一种简单的方法:

powersOfN :: [Integer]
powersOfN
  = zipWith (^) [N,N..] [0,1..]
以下是2的幂的示例:

Prelude> zipWith (^) [2,2..] [0,1..]
=>[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728..]

抱歉,是的,一个例子是取3次幂2,因此它将返回2的前3次幂->2:3:8@lakers2012您可以始终使用
尾部
。使用
scanl
的解决方案将是
powers=scanl(*)1。重复
…然后,
powers n=ps,其中ps=1:map(*n)ps
,以及
powers n=fix((1:).map(n*)