2014-01-26 2 views
1

Я пытаюсь обернуть мою голову вокруг этого следующий кусок кода:Продолжение Монада Рабочая

ex2 = do 
    a <- return 1 
    b <- Cont (\fred -> fred 10) 
    return $ a + b 

ghci > runCont ex2 show 
"11" 

Как строка «11» выход функции? Я получаю эту часть, что функция show преобразует 10 в String, но тогда как происходит a + b, поскольку цифры строк не могут суммироваться?

ответ

3

Ключ в том, что a и b имеют тип Int и преобразование в String с show делается только после того, как a и b суммируются.

Если вам нужно дополнительно убедительными, спросите себя, если у вас есть какие-либо проблемы с

runCont ex2 id 

или

runCont ex2 (\a -> a * a) 

Если вам нужно еще более убедительным, обратите внимание, что определение типа и монада пример:

data Cont r a = Cont { runCont :: (a -> r) -> r } 

instance Monad (Cont r) where 
    return a = Cont ($a) 

так что вы можете косоглазие немного и убедить себя, что ваш пример эквивалентен

ex = do 
    a <- return 1 
    b <- return 10 
    return (a + b) 

который только

ex = return (1 + 10) 
+1

Это может быть даже более освещая включать определение '' >> = и объяснить как 'Cont (\ fred -> fred 10)' равнозначно 'return 10'. –

Смежные вопросы