继续Monad工作

时间:2014-01-26 12:49:25

标签: haskell monads continuations

我正试图围绕以下这段代码:

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

ghci > runCont ex2 show
"11"

String“11”如何输出函数?我得到show函数将10转换为String的部分,但是a + b是如何发生的,因为字符串数字不能总结?

1 个答案:

答案 0 :(得分:3)

关键是ab的类型为Int,而Stringshow的转换仅在之后 / em> ab相加。

如果您需要进一步说服,请问自己是否有任何问题

runCont ex2 id

runCont ex2 (\a -> a * a)

如果您需要更有说服力,请注意类型定义和monad实例是

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)