chainCPS中变量的类型是什么?

时间:2016-05-29 10:13:48

标签: haskell types continuation-passing

我正在查看continuation passing style tutorial,无法理解以下函数中的类型。

  chainCPS :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> ((b -> r) -> r)
  chainCPS s f k = s z where 
    -- z :: (a -> r) -> a -> ((b -> r) -> r) -- Fails
    z x = f x k

以上是以下内容的改造:

  chainCPS :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> ((b -> r) -> r)
  chainCPS s f = \k -> s $ \x -> f x $ k

查看Atom编辑器提供的类型信息,我可以看到s :: (a -> r) -> rf :: a -> (b -> r) -> rk :: b -> r。此外z x的{​​{1}}类型为x :: a

令我感到困惑的是,z的类型为z :: a -> r

这意味着在将s z应用于r之后,z应为s类型。

如果是这样,最终类型如何出现在(b -> r) -> r

修改:b -> r来自k ...正确。这意味着z实际上属于a -> r类型,正如编辑所说。但那么为什么以下的类型检查失败?

  chainCPS :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> (b -> r) -> r
  chainCPS s f k = s z where
    z :: a -> r
    z x = f x k

1 个答案:

答案 0 :(得分:1)

  

这意味着在将s z应用于r之后,z应为s类型。

不。确实z someArg属于r类型,而someArg属于a类型,但此处我们正在应用s,而不是z

这里我们有

s :: (a -> r) -> r
z :: (a -> r)

所以z匹配s参数的类型。因此,结果类型是(a -> r) -> r的结果,r