我已经看到了以下定义:
getCC :: t -> ContT r m (t, t -> ContT r m b)
getCC x0 = callCC (\c -> let f x = c (x, f) in return (x0, f))
但如果有人隐藏了getCC
的类型声明,我将无法弄明白。
f
的类型是什么?
好吧,f
是一个接受t
并返回Cont r m (t, *something*)
的函数。但某些内容必须与f
具有相同的类型!
所以f :: Cont r m (t, Cont r m (t, Cont r m (t, Cont r m (t, ...)))
。
为什么/ ghc
如何推断f :: t -> Cont r m b)
?
答案 0 :(得分:2)
类型中没有递归:
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.Trans.Cont
getCC :: t -> ContT r m (t, t -> ContT r m b)
getCC x0 = callCC (\(c :: (t, t -> ContT r m b) -> ContT r m b)
-> let f :: t -> ContT r m b
f x = c (x, f)
in return (x0, f))