强加于列表的功能

1 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))),依此类推}

根据我的理解,列表的第n个条目F(x,y)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)
Run Code Online (Sandbox Code Playgroud)

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

样本输出将是

entry(1,1) = 
0,0
1,1
1,3
-7,7
1,-97
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*her 7

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

step (x,y) (i,j) = (i*i - j*j + x, 2*i*j + y)
Run Code Online (Sandbox Code Playgroud)

然后通过step (x,y)使用初始点迭代部分应用的函数来获得所需的列表(0,0),

entry (x,y) = iterate (step (x,y)) (0,0)
Run Code Online (Sandbox Code Playgroud)

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

entry (x,y) = iterate next (0,0)
  where
    next (u,v) = (u*u - v*v + x, 2*u*v + y)
Run Code Online (Sandbox Code Playgroud)

制作Mandelbrot套装,玩得开心;)