为什么在Haskell中允许这种递归(?)类型?

时间:2015-03-20 01:22:18

标签: haskell types type-inference

我已经看到了以下定义:

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)

1 个答案:

答案 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))