Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 为什么我们可以实现call/cc,但经典逻辑(直觉的&x2B;call/cc)不是建设性的?_Functional Programming_Continuations_Callcc_Curry Howard - Fatal编程技术网

Functional programming 为什么我们可以实现call/cc,但经典逻辑(直觉的&x2B;call/cc)不是建设性的?

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-

直觉逻辑是构造性的,是函数式编程中类型系统的基础。经典逻辑是不具建设性的,尤其是排除中间A定律∨ -A(或其等价物,如或)

但是,我们可以实现(构造)操作符(AKA call/cc),例如。那么为什么call/cc不具有建设性呢?

问题在于,call/cc的结果取决于评估的顺序。在Haskell中考虑下面的例子。假设我们有呼叫/抄送接线员

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
,它必须从运行时系统中实现,运行时系统直接控制堆栈。