作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在面向对象的语言中,当我需要在已知的生命周期内缓存/内存函数的结果时,我通常会遵循以下模式:
最佳答案
让我们使用 Luke Palmer 的内存库:Data.MemoCombinators
import qualified Data.MemoCombinators as Memo
import Data.Function (fix) -- we'll need this too
type Memoizable a = a -> a
type Memoizer a b = (a -> b) -> a -> b
Memoizable
函数和
Memoizer
,我们想要得到的内存函数。
runMemo :: Memoizer a b -> Memoizable (a -> b) -> a -> b
runMemo memo f = fix (f . memo)
fix
) 有点神奇。不要管那个;如果你有兴趣,你可以谷歌它。
Memoizable
经典 fib 示例的版本:
fib :: Memoizable (Integer -> Integer)
fib self = go
where go 0 = 1
go 1 = 1
go n = self (n-1) + self (n-2)
self
约定使代码简单明了。请记住,
self
是我们期望的这个函数的内存版本,所以递归调用应该在
self
上。 .现在启动 ghci。
ghci> let fib' = runMemo Memo.integral fib
ghci> fib' 10000
WALL OF NUMBERS CRANKED OUT RIDICULOUSLY FAST
runMemo
的酷点是您可以创建多个相同功能的新内存版本,并且它们不会共享内存库。这意味着我可以编写一个在本地创建和使用
fib'
的函数。 , 但随后尽快
fib'
超出范围(或更早,取决于编译器的智能),
它可以被垃圾收集 .它不必在顶层被内存。这可能会也可能不会与依赖
unsafePerformIO
的内存技术很好地配合。 .
Data.MemoCombinators
使用纯粹的惰性 Trie,与
runMemo
完美匹配.与其创建本质上成为内存管理器的对象,不如简单地按需创建内存函数。问题是如果你的函数是递归的,它必须写成
Memoizable
.好消息是您可以插入任何
Memoizer
你希望的。你甚至可以使用:
noMemo :: Memoizer a b
noMemo f = f
ghci> let fib' = runMemo noMemo fib
ghci> fib' 30 -- wait a while; it's computing stupidly
1346269
关于haskell - Haskell 中的短暂内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437793/
我有一个测验应用程序,用户可以在其中使用单选按钮回答一些问题。只有一个答案是正确的。 当我单击我的按钮以显示正确答案时,它会显示在 textView 中。 到目前为止,我还有另一个按钮可以导航到下一个
当使用 IoC 容器时,我可以指定当需要给定的依赖项时,要么每次传入一个新对象,要么传入的对象始终是同一个实例。 我曾认为内部和外部模块分别提供了该功能,但现在我不太确定。此外,我发现在使用“内部”模
我是一名优秀的程序员,十分优秀!