相关疑难解决方法(0)

尾优化保证 - Haskell中的循环编码

所以我的问题的简短版本是,我们如何在Haskell 编码循环呢?在Haskell中没有尾部优化保证,爆炸模式甚至不是标准的一部分(对吗?),并且折叠/展开范例不能保证在所有情况下都能工作.在这种情况下,只有爆炸模式才能让我在恒定的空间中运行(甚至没有使用$!帮助......虽然测试是在使用ghc-6.8.2的Ideone.com上完成的).

它基本上是一个嵌套循环,在列表范例中可以表示为

prod (sum,concat) . unzip $ 
    [ (c, [r | t]) | k<-[0..kmax], j<-[0..jmax], let (c,r,t)=...]
prod (f,g) x = (f.fst $ x, g.snd $ x)
Run Code Online (Sandbox Code Playgroud)

或者在伪代码中:

let list_store = [] in
for k from 0 to kmax
    for j from 0 to jmax
        if test(k,j) 
            list_store += [entry(k,j)]
        count += local_count(k,j)
result = (count, list_store)
Run Code Online (Sandbox Code Playgroud)

直到我添加了爆炸模式,我得到了内存爆炸甚至堆栈溢出.但爆炸模式不是标准的一部分,对吧?所以问题是,如何在标准的Haskell中对上面的代码进行编码,以便在恒定的空间中运行?

这是测试代码.计算是假的,但问题是一样的.编辑:foldr-formulated代码是:

testR m n …
Run Code Online (Sandbox Code Playgroud)

haskell loops tail-call-optimization

11
推荐指数
1
解决办法
959
查看次数

标签 统计

haskell ×1

loops ×1

tail-call-optimization ×1