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) -> r
、f :: a -> (b -> r) -> r
、k :: b -> r
。此外,在 z
中,x
是 x :: a
.
类型
令我困惑的是 z
是 z :: 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
类型,而someArg
是a
类型,但是这里我们应用的是s
,而不是z
.
这里我们有
s :: (a -> r) -> r
z :: (a -> r)
所以z
匹配s
的参数类型。因此,结果类型是 (a -> r) -> r
的结果,即 r
.
我正在查看 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) -> r
、f :: a -> (b -> r) -> r
、k :: b -> r
。此外,在 z
中,x
是 x :: a
.
令我困惑的是 z
是 z :: 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 typer
after applyingz
tos
.
没有。 z someArg
确实是r
类型,而someArg
是a
类型,但是这里我们应用的是s
,而不是z
.
这里我们有
s :: (a -> r) -> r
z :: (a -> r)
所以z
匹配s
的参数类型。因此,结果类型是 (a -> r) -> r
的结果,即 r
.