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很陌生,所以我一直试图解决为什么这不起作用以及如何让它正常工作.有帮助吗?
你是一个好方法,使用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套装,玩得开心;)