Class 如何使用Data.Function.Memoize的类方法?
我正在研究一个NP搜索问题,有人告诉我可以通过使用包来加快搜索过程。因为回忆录对我来说是一个新概念,我发现除了“标准的”回忆录斐波那契序列之外,我很难对其他任何东西进行思考 为了将数据类型“a”实例化为可记忆的,我需要在其上定义一个函数memoize(:(a->v)->a->v) 我有一个数据类型数据公式,它在类(Eq、Ord、Show)中。我必须定义自己的实例声明,但不知道需要什么函数Class 如何使用Data.Function.Memoize的类方法?,class,haskell,package,memoization,Class,Haskell,Package,Memoization,我正在研究一个NP搜索问题,有人告诉我可以通过使用包来加快搜索过程。因为回忆录对我来说是一个新概念,我发现除了“标准的”回忆录斐波那契序列之外,我很难对其他任何东西进行思考 为了将数据类型“a”实例化为可记忆的,我需要在其上定义一个函数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
Ie:如果声明了记忆a
的实例,则可以将其应用于从a到v的函数。包声明了一些基本类型的实例,如Int
因此,如果您希望记忆compute::Int->WidgetData
,应该使用类型相同的memoizecompute
,而不做任何操作
如果您希望将一个类型作为输入而不使用memoize实例的函数进行memoize,则必须自己声明它。更可能的情况是,您应该依赖诸如derivememorizable
之类的模板函数来完成这一任务:
{-# LANGUAGE TemplateHaskell #-} -- put this at the top
deriveMemoizable ''T
我怀疑函数应用程序(符合类型签名)是否会
加快速度
这取决于手头的问题。如果
compute
非常昂贵,并且您使用相同的输入调用它两次,它将存储结果并避免计算两次。如果不是这样,您将增加程序的内存使用,而不会获得任何好处。谢谢您的解释。我不确定的正是这个实例声明。我有一个数据类型数据公式
,它位于类(Eq,Ord,Show)
中。我必须定义自己的实例声明,但不知道需要什么函数。我知道在递归调用之间共享资源将是有益的。@Haxelaar请参阅我的编辑。在软件包文档的末尾有相关的帮助。刚才我第一次遇到TemplateHaskell。谢谢你。到目前为止,我还无法理解Memoisable
实例声明如何转换为我的数据类型。对我来说,类型(?)变量a
和b
似乎是半途而废的,我似乎无法将其转化为我的数据类型data Formula=a | b | C | For O OT FormI FormI——其中FormI是一个元组(Formula,Int),而O和OT都没有类型参数
,我需要在TemplateHaskell上读取这一个,或者我可以在没有扩展名的情况下解决这个问题吗?@Haxelaara
类型变量不会从空中掉下来。它是类型类的参数。这意味着实例知道它是什么,并且可以访问接口来实现正确的行为<代码>v
可以是任何类型。这意味着我们不能对此作任何假设。想想[a]
。您不需要了解有关a
的任何信息即可将其存储在列表中。这里的v
也是这样。