Data.Tree.unfoldTree对同一输入多次计算

时间:2014-05-18 16:24:48

标签: haskell tree lazy-evaluation

我必须生成一个树,其分支代表各种选择序列。我有三行(正面,中间和背面)和一组可以进入每一行的项目。树中的每个节点表示要输入的项目的顺序。我正在使用Data.Tree.unfoldTree,如下所示:

import Data.Tree as Tree
import Data.Seq as Seq

data RowType = Front | Middle | Back
data ChoiceTreeBuildLabel = Label (Seq.Seq RowType) Int Int Int

choiceTreeBuilder :: ChoiceTreeBuildLabel -> 
                     (Seq.Seq RowType, [ChoiceTreeBuildLabel])
choiceTreeBuilder (Label rt f m b) = (rt, concat [ff,mf,bf])
    where
        ff = if f == 0 then [] else [Label (Front <| rt) (f-1) m b]
        mf = if m == 0 then [] else [Label (Middle <| rt) f (m-1) b]
        bf = if b == 0 then [] else [Label (Back <| rt) f m (b-1)]

choiceTree f m b = Tree.unfoldTree choiceTreeBuilder (Label Seq.empty f m b)

但是,例如在评估length . last . Tree.levels $ choiceTree 3 4 5时,似乎并未存储此函数的值。也就是说,无论函数是否已被评估,函数似乎都需要生成一个新树。我可能错了,但我的印象是Haskell只需要计算一次,这确实是我的意图。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

Haskell一般 memoize函数应用程序!否则,想象一下运行时将使用多少内存作为任何被记忆的应用程序。更不用说哪个,甚至&#34;知道&#34;你打电话给&#34;同一&#34;如果你没有提供一些适当的概念&#34;同一性&#34;自己。

你可以&#34;纯粹&#34;通过手工或适当的帮助程序包记忆功能。人们倾向于使用的两个常见的是MemoTrie(http://hackage.haskell.org/package/MemoTrie)和memocombinators(http://hackage.haskell.org/package/data-memocombinators

可表示的Trie库(http://hackage.haskell.org/package/representable-tries-3.0.2/docs/Data-Functor-Representable-Trie.html)提供了一个更复杂但相似的概念