我无法理解上一个问题的答案.我希望以下的解释能够澄清事情.以下示例来自fpcomplete
import Control.Monad.Trans.Class import Control.Monad.Trans.Cont main = flip runContT return $ do lift $ putStrLn "alpha" (k, num) <- callCC $ \k -> let f x = k (f, x) in return (f, 0) lift $ putStrLn "beta" lift $ putStrLn "gamma" if num < 5 then k (num + 1) >> return () else lift $ print num
输出是
alpha beta gamma beta gamma beta gamma beta gamma beta gamma beta gamma 5
我想我理解这个例子是如何工作的,但是为什么有必要let
在callCC
"返回"连续中使用一个表达式,以便以后可以使用它.所以我尝试通过以下更简单的示例并修改它来直接返回延续.
import Control.Monad.Trans.Class import Control.Monad.Trans.Cont main = flip runContT return $ do lift $ putStrLn "alpha" callCC $ \k -> do k () lift $ putStrLn "uh oh..." lift $ putStrLn "beta" lift $ putStrLn "gamma"
这打印
alpha beta gamma
我将其修改为以下内容
import Control.Monad.Trans.Class import Control.Monad.Trans.Cont main = flip runContT return $ do lift $ putStrLn "alpha" f <- callCC $ \k -> do lift $ putStrLn "uh oh..." return k lift $ putStrLn "beta" lift $ putStrLn "gamma"
这个想法是继续将f
在我希望打印的测试示例中返回并且未被使用
uh oh... beta gamma
但是这个例子没有编译,为什么不能这样做呢?
编辑:考虑Scheme中的分析示例.据我所知,Scheme不会有问题,这是正确的吗?,但为什么呢?