Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 如何使用Data.Function.Memoize的类方法?_Class_Haskell_Package_Memoization - Fatal编程技术网

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

Class 如何使用Data.Function.Memoize的类方法?,class,haskell,package,memoization,Class,Haskell,Package,Memoization,我正在研究一个NP搜索问题,有人告诉我可以通过使用包来加快搜索过程。因为回忆录对我来说是一个新概念,我发现除了“标准的”回忆录斐波那契序列之外,我很难对其他任何东西进行思考 为了将数据类型“a”实例化为可记忆的,我需要在其上定义一个函数memoize(:(a->v)->a->v) 我有一个数据类型数据公式,它在类(Eq、Ord、Show)中。我必须定义自己的实例声明,但不知道需要什么函数 这个函数到底应该定义什么才能让回忆录工作?软件包描述没有详细说明这一点,我怀疑函数应用程序(适合类型签名)是

我正在研究一个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上读取这一个,或者我可以在没有扩展名的情况下解决这个问题吗?@Haxelaar
a
类型变量不会
从空中掉下来。它是类型类的参数。这意味着实例知道它是什么,并且可以访问接口来实现正确的行为<代码>v
可以是任何类型。这意味着我们不能对此作任何假设。想想
[a]
。您不需要了解有关
a
的任何信息即可将其存储在列表中。这里的
v
也是这样。