1

我正在查看延续传递样式教程,无法理解以下函数中的类型。

  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) -> r, f :: a -> (b -> r) -> r, k :: b -> r. 此外在zisx类型x :: a.

对此我感到困惑的z是 type z :: a -> r

这意味着应用到后s z应该是类型。rzs

如果是这样,最终类型是如何产生的(b -> r) -> r

编辑:b -> r来自k...对。正如编辑所说,这意味着z真的是 type 。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
4

1 回答 1

2

这意味着应用到后s z应该是类型。rzs

没有。z someArgis of type是真的r,whensomeArg是 type 的a,但是这里我们是申请的s,不是z

相反,我们有

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

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

于 2016-05-29T11:24:41.890 回答