继续寻求理解 ContT 和朋友的意义。请考虑下面的(荒谬但说明性的)代码:
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 调用替换 the,它会编译。这是怎么回事?
或者,如果我注释掉 x2 行,它也会编译。???
显然,这是原始代码的提炼版本,因此所有元素都有一个目的。感谢有关正在发生的事情以及如何解决它的解释性帮助。谢谢。