相关疑难解决方法(0)

有什么方法可以创建unmemo-monad?

假设某人制作了下棋或解决数独游戏的程序.在这种程序中,有一个表示游戏状态的树结构是有意义的.

这棵树非常大,"实际上是无限的".由于Haskell支持无限数据结构,因此这本身不是问题.

一个熟悉的无限数据结构示例:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)

节点仅在首次使用时分配,因此列表占用有限的内存.如果他们不保留对其头部的引用,也可以迭代无限列表,允许垃圾收集器收集其不再需要的部分.

回到树示例 - 假设一个人在树上进行一些迭代,如果仍然需要树的根,则迭代的树节点可能不会被释放(例如,在迭代加深搜索中,树将被迭代多次因此需要保留根).

我想到的这个问题的一个可能的解决方案是使用"unmemo-monad".

我将尝试使用monadic列表来演示这个monad应该做什么:

import Control.Monad.ListT (ListT)  -- cabal install List
import Data.Copointed  -- cabal install pointed
import Data.List.Class
import Prelude hiding (enumFromTo)

nums :: ListT Unmemo Int  -- What is Unmemo?
nums = enumFromTo 0 1000000

main = print $ div (copoint (foldlL (+) 0 nums)) (copoint (lengthL nums))
Run Code Online (Sandbox Code Playgroud)

使用时nums :: [Int],程序会在迭代nums过程中需要大量内存作为参考.lengthL numsfoldlL (+) 0 nums

目的 …

performance haskell

10
推荐指数
1
解决办法
432
查看次数

标签 统计

haskell ×1

performance ×1