我正试图围绕以下这段代码:
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
是如何发生的,因为字符串数字不能总结?
答案 0 :(得分:3)
关键是a
和b
的类型为Int
,而String
与show
的转换仅在之后 / em> a
和b
相加。
如果您需要进一步说服,请问自己是否有任何问题
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)