我正在查看延续传递样式教程,无法理解以下函数中的类型。
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
. 此外在z
isx
类型x :: a
.
对此我感到困惑的z
是 type z :: a -> r
。
这意味着应用到后s z
应该是类型。r
z
s
如果是这样,最终类型是如何产生的(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