Продолжение квеста, чтобы иметь смысл 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 и друзей»? Честное слово! Продолжение, которое можно понять, не является истинным продолжением. –