强加于列表的功能

时间:2012-10-01 21:39:03

标签: haskell functional-programming

我正在尝试编写一个使用此函数的Haskell函数:

  

E(x,y)(i,j)=((i * i) - (j * j)+ x,(2 * i * j)+ y)

F(x,y)的列表(x,y)应该是无限的项目列表:

  

F(x,y)= {(0,0),F(x,y)(0,0),F(x,y)(F(x,y)(0,0)),F (x,y)(F(x,y)(F(x,y)(0,0)))等等}

根据我的理解,列表F(x,y)的第n个条目是E(x,y)函数,它自己组成n次,然后应用于(0,0)

这就是我到目前为止的想法:

entry :: (Int,Int) -> [(Int,Int)]
efunction (i,j)(x,y) =  ((i*i) - (j*j) + x, (2*i*j) + y)
entry (x,y) = efunction(0,0)(x,y) where
    efunction = (0,0) : iterate efunction(i,j)

此外,(x,y)=(0,0)并保持不变。唯一变化的变量是(i,j)

示例输出

entry(1,1) = 
0,0
1,1
1,3
-7,7
1,-97

我对Haskell很陌生,所以我一直试图解决为什么这不起作用以及如何让它真正起作用。有什么帮助吗?

1 个答案:

答案 0 :(得分:7)

你的方式很好,使用iterate是正确的。你有两个参数的函数,并希望用一个固定的参数迭代它。如果固定参数是第一个,那么在iterate中使用会更方便,所以让我们定义

step (x,y) (i,j) = (i*i - j*j + x, 2*i*j + y)

然后通过迭代部分应用的函数step (x,y)得到您想要的列表,其初始点为(0,0)

entry (x,y) = iterate (step (x,y)) (0,0)

如果使用entry的参数而不是部分应用的step来定义本地函数,则可能更容易理解,

entry (x,y) = iterate next (0,0)
  where
    next (u,v) = (u*u - v*v + x, 2*u*v + y)

制作你的Mandelbrot套装很有趣;)