2009年6月存档

记忆多态函数——第二部分

第一部分在本系列中,介绍了涉及多态递归的函数的记忆问题。存储中使用的缓存数据结构通常只处理一个类型一次争论的结果。例如,可以有不同类型的有限映射,但每个具体的有限映射只包含一种键和一种值。

我扩展了记忆,通过使用存在类型和具体化类型来处理多态递归。这个扩展有效(afaik),但它被限制为要记忆的多态函数类型的特定形式,即

--多态函数键入k:-->v=所有a.HasType a=>k a->v a

我的动机示例是基于GADT的类型化lambda演算表示,我想记忆的一些函数不适合这种模式。写作后第一部分,我四处游荡,发现我可以将这些笨拙的类型多态函数转换为同构形式,这确实符合我可以处理的多态类型的限制模式。

继续阅读“记忆多态函数-第二部分”»

记忆多态函数——第一部分

Memoization接受一个函数,并返回一个语义等效的函数,当多次应用于同一参数时,该函数将重用而不是重新计算。变化包括由于增加了严格性,不完全等价,并将值相等替换为指针相等。

记忆通常以多态的方式打包:

备忘录::(??)=>(k->v)->(k->v)

对于基于指针的(“惰性”)记忆,类型约束(“???”)为空。对于基于等式的记忆,我们至少需要等式k,而且可能订单kHasTrie k公司用于高效查找(在有限映射或可能无限的映射中备忘录trie).

尽管备忘录是多态的,其自变量是单态的功能。使用映射或尝试利用单态性的实现,因为它们使用了类似于地图k v尝试k v.每个map或trie都是围绕特定(单态)类型的键构建的。也就是说,单个map或trie不会混合不同类型的键。

现在我发现自己想回忆多态的功能,我不知道该怎么做。

继续阅读“记忆多态函数-第一部分”»