gpt4 book ai didi

haskell - 如何在 Haskell 中强制立即调用函数?

转载 作者:行者123 更新时间:2023-12-02 05:32:58 26 4
gpt4 key购买 nike

这是我的代码:

import Data.Function.Memoize
import Debug.Trace

foo :: Int -> Int -> Int
foo a = memoFix fooMemo where
fooMemo f x = a + (trace (show x) cont) where
cont = if x == 0 then 0 else x + f (x - 1)

main = do
print $ foo 0 5
print $ foo 0 5
print $ foo 0 5

我希望它打印:

3
2
1
0
6
6
6

但是,相反,它打印了这个:

3
2
1
0
6
3
2
1
0
6
3
2
1
0
6

换句话说,函数没有像我预期的那样被内存。这可能是因为每次调用“foo 0”时,都会为“foo”创建一个新的备忘录表。我怎样才能强制 GHC 只对“memoFix fooMemo”求值一次,这样它就不会创建多个可内存表?

最佳答案

问题是,memotable 是为每个 参数值、foo 0 等创建的,而不是为整个foo 创建的。然后这些备忘录不会从 foo 的一次调用到下一次调用共享。解决方案是确保记住整个foo:

import Data.Function.Memoize
import Debug.Trace

foo :: Int -> Int -> Int
foo = memoize foo1 where
foo1 a = memoFix fooMemo where
fooMemo f x = a + (trace (show x) cont) where
cont = if x == 0 then 0 else x + f (x - 1)

main = do
print $ foo 0 5
print $ foo 0 5
print $ foo 0 5

顺便说一句,我发现以下编写方式比使用 memoFix 更容易:

foo :: Int -> Int -> Int
foo = memoize2 $ \a x ->
let cont = if x == 0 then 0 else x + foo a (x - 1)
in a + (trace (show x) cont)

关于haskell - 如何在 Haskell 中强制立即调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29860661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com