我有以下代码:
memoize f = (map f [0 ..] !!)
fib' 0 = 1
fib' 1 = 1
fib' n = fib' (n - 1) + fib' (n - 2)
fibMemo n = memoize fib' n
fibMemo' = memoize fib'
Run Code Online (Sandbox Code Playgroud)
(我知道斐波纳契实现具有指数时间复杂度并且不使用缓存)
我第一次执行fibmemo' 30
它需要3秒,第二次需要~0秒,因为结果是缓存的.但是第一个版本fibmemo
没有得到缓存的结果,它总是需要3秒才能执行.唯一的区别是定义(据我所知,这是相同的).
所以我的问题是,在Haskell中缓存了哪些函数?
我已经阅读了https://wiki.haskell.org/Memoization并且没有解决我的问题.
我有以下代码:
import Control.Monad
coin :: MonadPlus m => m Int
coin = return 0 `mplus` return 1
Run Code Online (Sandbox Code Playgroud)
如果我对coin :: Maybe Int
解释器进行评估,它会受到影响Just 0
.这是正常的,因为Maybe的实现是MonadPlus的实例.
如果我coin :: [Int]
在解释器上进行评估,则打印出来[0, 1]
,因为mplus
列表的实现是一个append
.
但如果我评估coin
,没有任何类型装饰器,它打印0
.为什么?口译员"转换"什么类型coin
来评估它?
此代码摘自:http://homes.sice.indiana.edu/ccshan/rational/S0956796811000189a.pdf