Functional programming 为什么我们可以实现call/cc,但经典逻辑(直觉的&x2B;call/cc)不是建设性的?
直觉逻辑是构造性的,是函数式编程中类型系统的基础。经典逻辑是不具建设性的,尤其是排除中间A定律∨ -A(或其等价物,如或) 但是,我们可以实现(构造)操作符(AKA call/cc),例如。那么为什么call/cc不具有建设性呢?问题在于,call/cc的结果取决于评估的顺序。在Haskell中考虑下面的例子。假设我们有呼叫/抄送接线员Functional programming 为什么我们可以实现call/cc,但经典逻辑(直觉的&x2B;call/cc)不是建设性的?,functional-programming,continuations,callcc,curry-howard,Functional Programming,Continuations,Callcc,Curry Howard,直觉逻辑是构造性的,是函数式编程中类型系统的基础。经典逻辑是不具建设性的,尤其是排除中间A定律∨ -A(或其等价物,如或) 但是,我们可以实现(构造)操作符(AKA call/cc),例如。那么为什么call/cc不具有建设性呢?问题在于,call/cc的结果取决于评估的顺序。在Haskell中考虑下面的例子。假设我们有呼叫/抄送接线员 callcc::((a->b)->a)->a callcc=未定义 让我们定义 example::Int 范例= callcc(\s-> callcc(\t-
callcc::((a->b)->a)->a
callcc=未定义
让我们定义
example::Int
范例=
callcc(\s->
callcc(\t->
S3+T4
)
)
这两个函数都是纯函数,因此应唯一确定example
的值。但是,这取决于评估顺序。如果先计算s3
,则结果为3
;如果首先计算t4
,则结果为4
这对应于延续单子(强制顺序)中的两个不同示例:
——结果是3
示例1::(MonadCont m)=>m Int
例1=
callCC(\s->
callCC(\t->do
x
callCC(\t->do
嗯,我们确实不能在Scheme本身中实现call/cc
,它必须从运行时系统中实现,运行时系统直接控制堆栈。