如何使用列表作为参数或在Haskell中返回值来记忆函数?

时间:2012-12-29 20:55:30

标签: haskell memoization

我正在实现一个带有以下签名的函数来解决Haskell中的0-1背包问题。

knapsack :: [Item] -> Capacity -> [Item]

ItemCapacity文件定义为:

type Value = Int
type Weight = Int

type Capacity = Int

type Item = (Value, Weight)

我想记住它以获得更好的表现。我尝试使用Data.MemoCombinators,但我无法了解如何使用它。

你能给我一些提示吗?

2 个答案:

答案 0 :(得分:6)

我成功地将MemoTrie用于此类任务。要用作记忆索引的每种类型都必须实现HasTrie。在您的情况下,您不必重复任何内容,因为包已经为原始数据类型以及对和列表提供了实例。

import Data.MemoTrie

type Value = Int
type Weight = Int

type Capacity = Int

type Item = (Value, Weight)

knapsack :: [Item] -> Capacity -> [Item]
knapsack = memo2 knapsack'
  where
    knapsack' items capacity = ... -- your computation goes here

答案 1 :(得分:2)

如果您正在寻找列表操作的性能优化,我建议您查看严格的迭代函数,例如Data.List.foldl'

  

foldl'::(a - > b - > a) - > a - > [b] - >一个