我无法理解之前的答案question https://stackoverflow.com/questions/20451022/how-to-interpret-callcc-in-haskell。我希望以下的解释能够澄清一些事情。下面的例子来自完整的 https://www.fpcomplete.com/user/jwiegley/understanding-continuations
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
但是这个例子无法编译,为什么不能这样做呢?
Edit:考虑方案中的类似示例。据我所知Scheme不会有问题,这是正确的吗?但是为什么呢?