发布于 2014-07-12 09:39:08
问题是,对于call/cc,结果取决于评估的顺序。考虑Haskell中的以下示例。假设我们有call/cc运算符
callcc :: ((a -> b) -> a) -> a
callcc = undefined让我们来定义
example :: Int
example =
callcc (\s ->
callcc (\t ->
s 3 + t 4
)
)这两个函数都是纯的,因此应该唯一地确定example的值。然而,这取决于评估顺序。如果首先计算s 3,则结果是3;如果首先计算t 4,则结果是4。
这相当于连续单(强制命令)中的两个不同的例子:
-- the result is 3
example1 :: (MonadCont m) => m Int
example1 =
callCC (\s ->
callCC (\t -> do
x <- s 3
y <- t 4
return (x + y)
)
)
-- the result is 4
example2 :: (MonadCont m) => m Int
example2 =
callCC (\s ->
callCC (\t -> do
y <- t 4 -- switched order
x <- s 3
return (x + y)
)
)它甚至取决于是否对某个术语进行了评估:
example' :: Int
example' = callcc (\s -> const 1 (s 2))如果计算s 2,则结果为2,否则为1。
这意味着在call/cc存在的情况下,丘奇-罗瑟定理 不保存。特别是,术语不再具有唯一的 正规形式。
也许一种可能是将call/cc看作是一个非确定性(非建设性)运算符,它将(不)按不同顺序计算不同子项所获得的所有可能结果结合起来。然后,程序的结果将是所有这些可能的范式的集合。然而,标准的调用/cc实现总是只选择其中的一个(取决于其特定的评估顺序)。
https://stackoverflow.com/questions/24711643
复制相似问题