class - 如何使用 Data.Function.Memoize 的类方法?

标签 class haskell package memoization

我正在处理 NP 搜索问题,有人告诉我可以使用 said 加快搜索过程包裹。由于内存对我来说是一个新概念,所以我发现除了“标准”内存斐波那契数列之外,我很难想到其他任何东西。

为了将数据类型 'a' 实例化为 Memoizable,我需要在其上定义一个函数 memoize (::(a-> v) -> a -> v)。

我在类(Eq、Ord、Show)中有一个数据类型数据公式。我将不得不定义自己的实例声明,但不知道期望的函数是什么。

这个函数究竟应该定义什么才能使内存起作用?包描述没有对此进行详细说明,我怀疑函数应用程序(符合类型签名)是否会加快速度。

最佳答案

您应该阅读有关类型类的内容。这是我对这个包的理解。

给出如下定义:

class Memoizable a where
  memoize ∷ (a → v) → a → v

你应该把 memoize 函数想象成这样:

memoize :: (Memoize a) => (a → v) → a → v

即:如果声明了 Memoize a 的实例,您可以将它应用于从 a 到 v 的函数。包声明一些基本类型的实例,如 Int

因此,如果你想内存compute::Int -> WidgetData,你应该使用具有相同类型的memoize compute而不做任何事情。

如果你想内存一个函数,该函数将一个没有内存实例的类型作为输入,你必须自己声明它。更有可能的是,您应该依靠像 deriveMemoizable 这样的模板函数来为您做这件事:

{-# LANGUAGE TemplateHaskell #-} -- put this at the top

deriveMemoizable ''T

I doubt function application (which fits the type signature) will speed anything up.

这取决于手头的问题。如果 compute 开销很大,并且您使用相同的输入调用它两次,它会存储结果并避免计算两次。如果不是这种情况,您将增加程序的内存使用量而没有任何好处。

关于class - 如何使用 Data.Function.Memoize 的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22836057/

相关文章:

java - 为什么我不能在迭代器上调用特定的类方法?

python - 从类调用函数而不声明名称对象

haskell - 理解 Haskell 中的递归斐波那契函数

Haskell 打印对

android - 无法安装 Xamarin.Android.Support.v4

c++ - 如何覆盖继承的嵌套类中存在的虚方法

c++ - 具有多态性的派生类中的重载函数 (C++)

haskell - 更新 mtl 后找不到模块 `Control.Monad.State`

r - 仅在包的描述中导入 foreach 时如何使用 %dopar%

python - 在 Pypi 上注册一个内部包