我正在努力理解Statemonad,并编写了著名的斐波那契数列的两个简单版本来记忆该函数。let体内的那只跑的很慢。那个<-跑得很快。我的问题:为什么?<-在允许M.lookup通孔Data.Map工作的同时,是否让以某种方式引起全面评估?
-- using state monad and let
-- very slow
fibLet :: Int -> State (M.Map Int Integer) Integer
fibLet n = do
case n of 0 -> return 0
1 -> return 1
n -> do
mp <- get
if M.member n mp
then return $ fromJust (M.lookup n mp)
else do
let s1 = evalState (fibLet (n - 1)) mp
let s2 = evalState (fibLet (n …Run Code Online (Sandbox Code Playgroud)