作为Haskell的新手,我试图多次迭代一个函数(例如,逻辑映射).在命令式语言中,这将是一个简单的循环,但在Haskell中,我最终会出现堆栈溢出.以此代码为例:
main = print $ iter 1000000
f x = 4.0*x*(1.0-x)
iter :: Int -> Double
iter 0 = 0.3
iter n = f $ iter (n-1)
Run Code Online (Sandbox Code Playgroud)
对于少量迭代,代码可以工作,但是对于一百万次迭代,我得到了堆栈空间溢出:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样.这里的尾递归应该没问题.也许问题是懒惰的评价.我尝试了几种方法来强制进行严格的评估,通过插入$!或seq在不同的位置,但没有成功.
什么是Haskell迭代函数很多次的方法?
我已经尝试过相关帖子的建议:这里或这里,但我总是以堆栈流程结束大量的迭代,例如main = print $ iterate f 0.3 !! 1000000.
Julia lang文档解释了如何使用内部构造函数和new()函数构造自引用对象:
type SelfReferential
obj::SelfReferential
SelfReferential() = (x = new(); x.obj = x)
end
Run Code Online (Sandbox Code Playgroud)
但是,该方法不适用于不可变类型,因为它实质上使用了未完全初始化的实例x的突变。
如何在Julia中生成自引用不可变对象?