Functional programming 理解多提示分隔连续体的API
本文介绍了一种用于多提示分隔连续体的API 我的问题涉及推送分包的类型:('a,'b)分包->(单元->'a)->'b。为什么这种类型不是Functional programming 理解多提示分隔连续体的API,functional-programming,ocaml,delimited-continuations,Functional Programming,Ocaml,Delimited Continuations,本文介绍了一种用于多提示分隔连续体的API 我的问题涉及推送分包的类型:('a,'b)分包->(单元->'a)->'b。为什么这种类型不是('a,'b)subcont->'a->'b?此外,为什么分包有单独的类型:为什么不简单地('a,'b)subcont='a->'b?我几乎可以肯定这有一个很好的理由,因为Oleg使事物尽可能优雅(但不是更优雅) 谢谢 为什么不('a,'b)分包->'a->'b? 我认为这与推送提示的原因相同,因为推送提示更容易理解push_提示符p(fun()->e)直观上
('a,'b)subcont->'a->'b
?此外,为什么分包有单独的类型:为什么不简单地('a,'b)subcont='a->'b
?我几乎可以肯定这有一个很好的理由,因为Oleg使事物尽可能优雅(但不是更优雅)
谢谢 为什么不('a,'b)分包->'a->'b
?
我认为这与推送提示的原因相同,因为推送提示更容易理解push_提示符p(fun()->e)
直观上是一种try e with p
的形式:提示符p
作为处理程序放在堆栈上,并且e
在该处理程序下运行。如果改用push_prompt p e
,则严格的语言将首先计算参数p
和e
,并且e
将在设置提示之前运行并“引发异常”
push_subcont sk(fun()->e)
可能有同样的问题:直观地说,这是一种“重新启动被异常中断的计算sk
”。重要的是,e
在计算上下文内部运行,而不是在计算上下文外部运行,例如,如果它希望引发与sk
安装的处理程序相对应的异常
为什么不简单地('a,'b)subcont='a->'b
?
如果只有一种方法可以重新启动子例程,那么就可以这样做:可以以函数的形式返回“pre-restarted”,当应用函数时,这些函数将使用给定的参数重新启动
但事实并非如此:本文末尾描述了具有不同语义的push_subc
和push_delim_subc
。“调用者”应该选择使用哪种重启技术。它们都需要访问子节点的内部数据,因此无法将子节点作为函数表示进行操作