【发布时间】:2013-07-16 19:02:57
【问题描述】:
我有一个函数
slow :: Double -> Double
它经常被调用(数亿次),但只被调用大约一千个离散值。这似乎是记忆的绝佳候选者,但我不知道如何记忆 Double 的函数。
制作列表的标准技术不起作用,因为它不是整数类型。我查看了 Data.MemoCombinators,但它本身并不支持 Doubles。有一个bits 函数用于处理更多数据类型,但Double 不是Data.Bits 的实例。
有没有一种优雅的方式来记忆“慢”?
【问题讨论】:
-
如果你知道它会被提前调用的值,你可以使用
Data.Map、fromList和map。如果您不提前知道这些值,则需要某种惰性数据结构来表示“将slow应用于Double类型的所有可能值”。以理智的方式做到这一点的困难在于,目前Data.MemoCombinators中没有任何内容。 -
在编译时计算所有值,然后构建一个包含 1000 个分支的巨型 case 语句。没有比这更高效的了。
-
@GabrielGonzalez:我很乐意,但是直到运行时才知道 1000 个分支。
标签: haskell memoization