繼續追求理解ContT和朋友。請考慮以下(荒謬但說明性的)代碼:Haskell與ContT,callCC混淆,當
v :: IO (Either String [String])
v = return $ Left "Error message"
doit :: IO (Either String())
doit = (flip runContT return) $ callCC $ \k -> do
x <- liftIO $ v
x2 <- either (k . Left) return x
when True $ k (Left "Error message 2")
-- k (Left "Error message 3")
return $ Right() -- success
此代碼不能編譯。但是,如果將when
替換爲它下面的註釋k調用,它將進行編譯。這是怎麼回事?
或者,如果我註釋掉x2行,它也會編譯。 ???
顯然,這是原始代碼的蒸餾版本,因此所有元素都有其用途。感謝關於正在發生的事情以及如何解決它的解釋性幫助。謝謝。
「持續追求理解ContT和朋友」?傻瓜的差事!可以理解的延續不是真正的延續。 – 2010-02-09 14:59:00