chainCPS 中变量的类型是什么?

What is the type of the variables in chainCPS?

我正在查看 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 中,xx :: a.

类型

令我困惑的是 zz :: a -> r 类型。

这意味着 s z 在将 z 应用到 s 之后应该是 r 类型。

如果是这样,最后的类型是怎么出来的(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

That means that s z should be of type r after applying z to s.

没有。 z someArg确实是r类型,而someArga类型,但是这里我们应用的是s,而不是z .

这里我们有

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

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