当前位置: 首页 > news >正文

瑞安市网站建设北仑网站建设培训学校

瑞安市网站建设,北仑网站建设培训学校,合江网站建设,php完整网站开发案例这则影片随附此文章#xff0c;没有它不会有太大意义 上个月#xff0c;我在Curry On会议上做了演讲#xff0c;该会议是与学术#xff0c;编程语言会议ECOOP共同举办的新会议。 Curry On旨在弥合学术界之间的鸿沟。 我的学术兴趣不包括编程语言#xff0c;我认为编程语言… 这则影片随附此文章没有它不会有太大意义 上个月我在Curry On会议上做了演讲该会议是与学术编程语言会议ECOOP共同举办的新会议。 Curry On旨在弥合学术界之间的鸿沟。 我的学术兴趣不包括编程语言我认为编程语言是计算机科学的一门学科与其他任何学科相比它始终被高估和交付不足可能是AI除外。 我对算法比对抽象更感兴趣并且编程语言研究主要与后者有关。 但是作为开发人员我必须使用我选择使用的编程语言提供的抽象并且令我感到震惊的是我注意到某些抽象从学术语言到主流的流行在某些情况下使身体不好主要引起疼痛。 举个例子我想想一想与使用Haskell相比现在Java中使用monad的人越来越多。 在我的演讲中我提出了命令式编程的核心抽象是阻塞线程。 一旦将其删除您将失去大多数其他命令式抽象例如控制流和异常处理要求它们在库中重新实现命令式语言带来的大多数优势包括事后调试性能分析和自动背压。 这也使代码难于编写和阅读。 我认为无论您是否使用monad减轻其痛苦异步编程都是对命令式语言的厌恶。 异步和命令之间的不匹配是根本的。 一直以来我们可以达到与monads一样强大的抽象如果不是更多的话这自然是命令式语言的合适之选与它们的结构和功能完美地结合在一起。 如果您还没有的话现在是观看演讲的好时机 在我的演讲中我声称就像monads是纯函数式编程的超级抽象一样延续是命令式编程的超级抽象并且引入了一种抽象我称为“作用域延续”这仅是带分隔符的延续 。一种特殊的酱料我不知道这个概念是否在其他地方讨论过如果有我很想知道它的专有名称请参阅文章末尾的附加内容。 由于我在演讲之前不久就想到了这个主意因此在介绍范围内的延续时我并没有做好准备并且由于此后我最近对该主题进行了更多考虑所以我想继续讨论这个主意。 我提出了三点主张 范围内的延续自然符合命令性代码 范围连续像单子一样强大 有范围的延续比单子更好 我认为我为第1点说明了理由因为范围内的延续使您可以保持命令式控制流并且它们保留了堆栈上下文这对于事后调试和性能分析至关重要。 当谈到2时我更加模糊直觉地注意到了monad与续奏之间的联系并提供了一些示例但没有提供证明因此听众理所当然地要求我这么做。 第一轮连锁–定界延续vs.单子 演讲结束后我与朱利安·阿尼 Julian Arni 进行了交谈后者向我展示了丹·皮波尼 Dan Piponi撰写的博客文章《所有人的母亲》 。 有关Reddit的讨论 使我想到了由Andrzej Filinski 1于1994年提出的证明 定界的连续性在Filinski的论文中称为部分或可组合的连续性可以表示任何一元组合。 他说 我们表明任何其单元和扩展操作可表示为纯功能术语的monad都可以通过“可组合的延续”嵌入按值调用语言中… …值得注意的是monad对“不纯”函数式编程没有可比的影响。 可能的主要原因可能是……单子框架已经内置在渴望有效的功能性语言的语义核心中因此无需明确表达。 语言例如可更新状态异常或一流的延续和语言外部I / OOS接口等的“不纯净”构造都遵循一元法。 似乎唯一缺少的方面是程序员能够以与内置效果相同的便捷性和自然性使用自己的特定于应用程序的单子抽象例如不确定性或解析器。 ……在下文中我们将证明……具有第一类延续性的一种语言……已经“单调完成”因为任何以某种扭曲的单调风格表达的程序也可以直接编写。 我没有遵循Filinski论文的必要背景但是如果我没有记错的话证明的困难源于以下事实从单子形式到连续形式他称之为“直接样式”的转换是不是单调函数或单调作曲者的简单数学映射Haskell称之为bind 而是需要对其源代码表示进行更深层次的转换。 但是我将以一种有希望的方式介绍定界连续的具体实现方式以期解释moand-continuation相似性背后的直觉。 定界的延续捕获了调用堆栈的一部分。 它使我们暂停计算然后再恢复它。 让我们看一下Java中定界的延续API public class ContinuationT implements Runnable, Serializable, Cloneable {public Continuation(CallableT target) { ... }public T run() { ... }public boolean isDone() { ... }public T getResult() { ... }public static Continuation? suspend(ConsumerContinuation? ccc) { ... } } suspend方法类似于Scheme的shift 暂停当前的延续假设我们正在内部运行并调用可选提供的回调ccc 名称ccc是Called with Current Continuation的首字母缩写这是一种玩法在Scheme的call-cc 。 run功能对应于Scheme的reset 将执行继续直到其暂停或终止。 因此例如 class Foo {static int foo() {bar();bar();return 3;}static void bar() {System.out.println(Pausing...);Continuation.suspend(null);}public static void main(String[] args) {ContinuationInteger c new Continuation(Foo::foo);c.run(); // prints Pausing...c.run(); // prints Pausing...c.run();System.out.println(c.getResult()); // prints 3} } 因为suspend返回了延续并将其传递给回调所以我们可以扩展Continuation类并添加一些内部字段以产生ValuedContinuation public class ValuedContinuationT, Out, In extends ContinuationT {private Out pauseOut;private In pauseIn;private RuntimeException pauseInException;public run(In in);public run(RuntimeException e);public Out getPauseValue() { ... }public static Out, In In pause(Out value) {...}public static In In pause(ConsumerValuedContinuation?, ?, In ccc) {...}public static V, In In pause(V x, BiConsumerV, ValuedContinuation?, ?, In ccc) {...} } ValuedContinutation 我们可以将值传入和传出延续。 如果我们调用pause(3) 则getPauseValue将返回值3 而如果使用run(5)恢复继续则将由pause返回值5 。 run(new RuntimeException())将导致pause以引发该异常。 例如 ValuedContinuationVoid, Integer, Integer c new ValuedContinuation(() - {int x pause(5);x pause(x 10);x pause(x * 100);return null;});while(!c.isDone()) {c.run(3);System.out.println(c.getPauseValue()); // prints: 5, 13, 300 } 现在我们可以理解连续性可以表达任何monad的主张的直觉 我们的monadic作曲者 或bind 将是传递给pause的回调ccc 每次pause的代码是c.run(x)序列中的下一个monadic函数并且调用c.run(x)正在应用链中的下一个c.run(x)函数。 区别在于单子函数将蹦床功能返回到封闭的作曲家绑定而在这里我们在延续中称作作曲家我们的ccc 。 正如我在演讲中所声称的命令式语言中的继续性的优点是它们与所有命令式概念例如命令式控制流和异常良好地交互并保留了对于调试和性能分析非常重要的堆栈上下文。 在继续之前让我们看一个使用ccc回调的示例。 这是“未来单子”延续形式的一个例子。 假设我们有一个异步服务 interface AsyncHandlerT {void success(T result);void failure(RuntimeException error); }interface AsyncServiceT {void submit(AsyncHandlerT callback); } 然后我们可以定义此方法 static T ConsumerValuedContinuation?, ?, T await(AsyncServiceT service) {return c - {service.submit(new AsyncHandlerT() {public void success(T result) {c.run(result);}public void failure(RuntimeException error) {c.run(error);}});}; } 我们将在延续中运行的代码中使用该代码如下所示 String y pause(await(service)); 上面的代码将暂停继续直到服务请求完成然后将其恢复为结果。 第二轮作曲–范围延续与Monad变形金刚 在演讲中我还声称单子很难构成2 即使使用纯功能语言也是如此这非常适合单子。 编写monad即编写使用异常和 IO 并产生序列的monadic代码需要使用monad变换器 因为它们利用非常高阶的函数来形成一个让人脑筋急转的lambish间接函数 因此很难理解。 为了创建易于组合的延续在我的演讲中我介绍了作用域延续 这是带分隔符的延续的变体。 范围内的延续是嵌套的延续在任何级别代码都可以自由地暂停其任何包含的延续。 这个想法与嵌套的try / catch块非常相似在嵌套的try / catch块中根据异常类型执行会跳转到相应嵌套范围的catch块。 为了测试该想法在实践中的效果如何我已经在Java和Clojure中实现了一个有范围的延续原型。 您可以分别在 Quasar和Pulsar的cont分支 此处和此处中使用作用域延续来查找代码。 为了实现延续我使用了Quasar的工具该工具非常简单尽管有范围的延续可能有一天会进入上游Quasar但这种情况不会很快发生因为我们首先需要使工具完全透明且可以不使用我们希望Java 9发布时该怎么做。 最困难的部分是支持在一个连续引用不仅存在于堆栈中而且还可能存在于堆中的环境中克隆嵌套的延续下面介绍的非确定性延续所需要。 我尝试了三种不同的方法但我对其中任何一种都不满意。 对于范围连续我们需要稍微更改Continuation 和类似ValuedContinuation 类 public class ContinuationS extends Suspend, T implements Runnable, Serializable, Cloneable {public Continuation(ClassS scope, CallableT target) { ... } // -- scopepublic T run() { ... }public boolean isDone() { ... }public T getResult() { ... }public static Continuation? suspend(S scope, ConsumerContinuation? ccc) { ... } // -- scope } 范围是全局名称。 在Java中我选择表示一个范围就像表示异常范围一样作为类名在当前实现中范围是扩展Suspend类该类是异常类型。 范围的延续定义和使用方式如下 class AContT extends ValuedContinuationAScope, T {public Continuation(CallableT target) {super(AScope.class);// ...}public static AScope A new AScope(); }// similarly BCont, and then:static void foo() {ContinuationVoid c new ACont(() - {// ...ContinuationVoid c new BCont(() - {// ...suspend(B, ...); // suspends the enclosing BCont// ...suspend(A, ...); // suspends the enclosing ACont// ...});// ...});// ... } 在Clojure中范围是全局符号并且可以将范围的延续定义为 (let ; ....(let ; ....(pause B ...); ...(pause A ...); ...))])))]; ... ) 范围延续的概念是暂停任何封闭的延续范围相当于返回到任何封闭的作曲家绑定的单子函数。 但是在范围连续的情况下我们不需要monad变换器来转换作曲者或链接的monadic函数。 为了了解这种组合在实际代码中的外观我实现了两种延续类型 CoIterable 与Python生成器一样生成具有延续的Iterable并对应于Haskell的list monad和Ambiguity 实现了不确定性计算回溯a-la Scheme的amb并对应于Haskell的amb monad。 孤立地 CoIterable的用法如下 IterableInteger range(int from, int to) {return new CoIterable(() - {for (int i from; i to; i)produce(i);}); } 有关CoIterable运算符的示例例如flatmap map和filter请参见此处 并注意额外的灵活性延续给了我们单子。 由于单子函数将蹦床返回给作曲者因此必须根据单个平面映射作曲者来实现filter和map操作而对于延续我们可以从延续中自由选择自己的构图规则并且可以实现filter并独立于flatMap进行map 以获得更好的性能。 这是隔离中使用Ambiguity的示例 AmbiguityInteger amb solve(() - {int a amb(1, 2, 3); // a is either 1, 2, or 3int b amb(2, 3, 4); // b is either 2, 3, or 4assertThat(b a); // ... but we know that b areturn b;});amb.run(); // returns 2 as thats the only possible solution for b 现在让我们看看两者是如何无缝组合的 AmbiguityInteger amb solve(() - {IterableInteger a iterable(() - {produce(amb(2, 1)); // pauses on Ambiguity and CoIterableproduce(amb(3, 10));});int sum 0;for (int x : a) { // using imperative loops on purpose; functional would work, toosum x;assertThat(x % 2 0); // we assert that all elements are even}return sum; });amb.run(); // returns 12 注意如何a延续中止既对Ambiguity以及对CoIterable范围。 它创建一个列表第一个元素为2或1 第二个元素为3或10 产生四个可能的列表 (2, 3) (2, 10) (1, 3)和(1, 10) 。 后来我们断言所有元件必须是偶数这意味着对于唯一有效的列表a是(2, 10)以及用于唯一可能的值sum是12。 作为最后一个示例可以在此处和此处的测试中找到更多示例可以在此处找到Clojure示例让我们通过另一层嵌套将事情进一步复杂化 FiberInteger f new Fiber(() - {AmbiguityInteger amb solve(() - {IterableInteger a iterable(() - {produce(amb(2, 1));sleep(20); // pauses on the Fiber scopeproduce(amb(3, 10));});int sum 0;for (int x : a) {sum x;Fiber.sleep(20);assertThat(x % 2 0);}return sum;});return amb.run(); }).start();f.get(); // returns 12 现在我们将整个内容嵌套在光纤中-Quasar的轻量级线程实现-仅仅是Java的ForkJoin调度程序调度的延续而已。 现在内嵌套代码a在三个不同范围内暂停没有打破汗水没有任何形式的变压器。 但是类型安全呢 Haskell具有非常丰富的类型系统而Monad可以极大地发挥作用。 通过查看monadic函数的签名您可以立即知道它可以“驻留”在哪种monad类型中并且不能在该monad之外的任何地方使用它。 事实证明可以在不失去其任何期望属性的情况下对作用域连续进行同样类型的安全键入。 为此我们需要一个简单的类型系统来声明 void foo() suspends A, B 这意味着foo可能会在A和B范围内暂停继续执行因此只能在两个范围内的代码中调用。 然后将Continuation类定义为在伪Java中 public class ContinuationS extends Suspend, T implements Runnable, Serializable, Cloneable {public Continuation(ClassS scope, [CallableT suspends S|Others] target) { ... }public T run() suspends Others { ... }public static Continuation? suspend(S scope, ConsumerContinuation? ccc) suspends S } 因此延续可以运行任何可能在参数化的S范围以及其他范围上可能挂起的目标代码而run方法可以吞咽S范围但仍在挂起其他范围。 事实证明我们已经有了这样的类型系统- 几乎是 Java的检查异常。 如果我们创建了Suspend范围所有范围都从该范围下降则我们可以使用Java的throws 就像上面的伪Java中的suspend一样。 我之所以没有这样做是因为Java的类型系统不允许您捕获多个经过检查的异常类型就像我在上述“ Others所做的那样这意味着我们需要显式的实例来处理显式的范围变量挂起一个范围的函数两个范围等这可能会使事情变得麻烦。 然后我们还可以通过参数化范围来提高ValuedContinuation的类型安全性这样我们就可以 void foo() suspends CoIterableScopeInteger 这只会让foo在产生一个Integer序列而不是String 的CoIterable中被调用。 不幸的是我们也不能完全做到这一点因为Java当前不允许泛型异常类型。 未完待续 我希望通过更深入地讨论范围内的连续性我能够比我在演讲中挥舞过的手挥舞的方法更好地解释这个想法并且我很高兴找到菲林斯基的证明这在PL圈子中可能是众所周知的 。 我希望我的演讲使您相信单语在命令式语言中没有地位也许除了并行计算之外如果没有我很想听听为什么不这样做。 我还相信即使在PFP语言中范围连续的合成也比monad更好而且monad通常不是一种很好的效果建模方法但这是另外一个讨论。 最后尽管我坚信命令性语言应该具有某种形式的轻量级线程AKA光纤AKA用户模式线程AKA绿线程排序和线程任何类型不过是由适当的调度程序调度的延续我不一定认为命令性语言应该直接将范围化的延续作为抽象公开。 毕竟存在抽象以增加代码重用性帮助代码维护和帮助验证总之它们存在是为了降低开发成本并且至少从非研究的角度来看它们是唯一的度量标准判断3 。 我认为延续性是PFP优雅的monad的优雅命令但是我还不相信它们在实践中的实用性。 如果您想了解更多有关延续的知识这就是延续发展的历史它可以称赞所有合适的人。 附录1 自从首次发布此博客文章以来我设法在Philip Wadler于1993年发表的一篇论文中找到了关于范围延续的参考该论文名为Monads and composablecontinuations 他将范围延续简单地称为“具有多个层次的可组合延续”。 沃德勒证明定界的延续可由单子表示而菲林斯基证明一年后二元论可表示为定界的延续这有理由推论两者是对偶的。 尽管如此有理由认为即使是对偶每种也都更适合于特定的编程风格并且毫无疑问延续更适合于不纯洁的按值调用的语言命令式和函数式命令式。 瓦德勒在总结论文时说 具有多个层次的可组合延续的一个目标是能够将不同的影响分解为不同的层次。 Danvy和Filinski声称以这种方式将各种效果均匀地组合起来相对容易。 Monads还旨在通过简化组合的方式来分解效果。 但是没有统一的规则来组合任何两个单子。 本文使用了monad来阐明可组合的延续。 可组合的延续词会阐明单子组合的问题吗 附录2 在网上讨论中一位读者评论说我通过谈论单子而不是单子来误解了单子。 我认为这仅是解释上的差异因此我想澄清一下 正如已经证明我认为的那样任何效果都可以由单子模拟您可以说所有效果都是单子的但是就像著名笑话中的数学家一样这是绝对正确的但绝对没有用取决于您的观点。 -视图我猜。 从数学的角度看只要两件事同构它们就是“相同”的。 但是从编程的角度来看两者可能是非常不同的因为抽象是与程序员思想上的心理交互而两个同构的数学概念在心理上与程序员之间的交互也非常不同。 因此如果在处理抽象时我不必“思考单子”那么即使它们之间存在同构抽象也不是单子。 根据数学解释“反对单子”与反对数字1一样荒谬。在我的解释中用阿拉伯数字教堂数字或集合论数字表示数字1在心理上有很大不同并且因此在编程语言上有根本不同因为编程语言首先是人类语言。 在一种编程语言中抽象是通过数学以及心理或经济特性来定义和测量的。 我是一个“算法论者”而不是一个“抽象论者”不幸的是我认为这两个CS观点常常是矛盾的因此我仅在抽象化在编写和维护方面带来的成本变化方面衡量其有用性我的算法对我来说单子是一种设计模式而不是以某种特定符号表示的数学对象。 然后我发现这篇文章说Filinski的证明并不适用于利用懒惰按姓名呼叫评估的单子 例如尝试使用CompletableFutures组成Java流。 这并不容易。 请参阅此HN关于此主题的讨论 。 翻译自: https://www.javacodegeeks.com/2015/08/from-imperative-to-pure-functional-and-back-again-monads-vs-scoped-continuations.html
http://www.sadfv.cn/news/110386/

相关文章:

  • word做网站wordpress本地下载
  • 学校网站内容建设方案丹东网站制作
  • 兼职做网站的费用专为男人做的网站
  • 电影新网站如何做seo优化中国与俄罗斯最新局势
  • 哪里有做网站的seo零基础培训
  • 粉红色的网站首页东莞平台网站建设设计公司
  • 大连网站策划推进网站 集约化建设
  • 做网站接单的网站怎么制作糖葫芦教程
  • 一个做品牌零食特卖的网站定制开发电商网站建设公司
  • 外贸网站推广工作站长查询站长工具
  • php网站开发实验总结关键词优化设计
  • 网站配色的原理和方法潍坊百度网站
  • 国外画册设计欣赏网站天津平台网站建设制作
  • 网站建设费算办公费吗注册公司怎样网上核名
  • 电商企业网站建设的一般要素有哪些深圳建立网站的公司
  • 国内设计网站公司平台兼职网站开发
  • 做cpa一定要有网站吗校园网站建设管理制度
  • 福田网站优化什么是网络营销系统
  • 发布软文网站兰州网站建设公
  • 兰州哪家网站做推广效果好房地产市场
  • 青岛市建设监理协会网站网站优化培训班
  • 秦皇岛建设网站西安搬家公司电话附近联系方式
  • 挖矿网站开发摄影大赛官网
  • 上海优化排名网站石家庄平山网站推广优化
  • 哪里有做网站培训的企业营销型网站费用
  • 网站安全维护怎么做wordpress小程序配置
  • 佳木斯网站网站建设网站上怎么做动画广告
  • 模板网站演示站点怎么做泰安东平房产信息网
  • icann 域名注册网站sem竞价推广公司
  • 福州房地产网站建设网站建设算固定资产吗