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

时间:2014-04-03 11:22:31

标签: class haskell package memoization

我正在研究NP搜索问题,并被告知我可以使用said包加快搜索过程。由于备忘录对我来说是一个新概念,我发现很难将我的头脑包围在除标准之外的任何其他事物上。记忆斐波那契序列。

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

我有类中的数据类型数据公式(Eq,Ord,Show)。我将不得不定义我自己的实例声明,但不知道预期的功能。

这个函数究竟应该为memoisation定义什么?包描述并没有详细说明,我怀疑功能应用程序(适合类型签名)会加速任何事情。

1 个答案:

答案 0 :(得分:5)

您应该阅读有关类型类的内容。以下是我对包装的理解。

给出以下定义:

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

您应该将memoize函数视为:

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

即:如果声明Memoize a的实例,则可以将其应用于函数。该包声明了一些基本类型的实例,如Int

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

如果你想记住一个没有Memoize实例的输入类型的函数,你必须自己声明它。更有可能的是,您应该依赖deriveMemoizable之类的模板函数来为您完成这些:

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

deriveMemoizable ''T
  

我怀疑功能应用程序(适合类型签名)会   加快速度。

这取决于手上的问题。如果compute价格昂贵,并且您使用相同的输入调用它两次,它将存储结果并避免计算两次。如果不是这种情况,您将增加程序的内存使用量而不会有任何收获。