continuation-passing相关内容
我目前正在试验延续 monad.Cont 实际上在 Javascript 中很有用,因为它从回调模式中抽象出来. 当我们处理一元递归时,总会有堆栈溢出的风险,因为递归调用不在尾部位置: const chain = g =>f=>k=>g(x => f(x) (k));= x => 的常量k=>k(x);const id = x =>X;const inc = x =>x + 1;con
..
这是一个右折叠的简单实现: const foldr = f =>acc =>([x, ...xs]) =>x === 未定义?ACC: f(x) (foldkr(f) (acc) (xs)); 这是非尾递归,因此我们不能应用蹦床.一种方法是使算法迭代并使用堆栈来模拟函数调用堆栈. 另一种方法是将递归转换为 CPS: const Cont = k =>({runCont: k});con
..
有问题的代码是这样的: (定义multirember&co(拉姆达(一个经纬度)(条件((空?纬度)(col (quote ()) (quote ())))((eq? (汽车纬度) a)(multirember&co a(cdr 纬度)(拉姆达(见newlat)(上校纽拉特(缺点(汽车纬度)看到)))))(别的(multirember&co a(cdr 纬度)(拉姆达(见newlat)(col
..
我一直在关注有关将在 c# 5.0 中的新 async 功能的新公告.我对延续传递风格和新的 c# 编译器对代码的转换有了基本的了解,就像来自 埃里克·利珀特的帖子: async void ArchiveDocuments(List urls){任务存档=空;for(int i = 0; i
..
我在维基百科上遇到了这段代码: (define (pyth x y k)(* x x (拉姆达 (x2)(* y y (λ (y2)(+ x2 y2 (λ (x2py2)(sqrt x2py2 k))))))))) 文章说那段代码是另一段代码的Continuation-Passing版本: (定义(pyth x y)(sqrt (+ (* x x) (* y y)))) 然而,我很困惑:这
..
在 Scheme Programming Language 中,Kent Dybvig(第 4 版)
..
我们被要求编写一个程序,当给定一个列表时,它将替换给定元素的第一次出现,并且只替换第一个,但问题是用 CPS 风格编写.我们无法将其转换为 CPS 风格的书面程序,该程序给出了成功连续和失败连续.. 如果有人愿意尝试,我们将不胜感激:] 我们拥有的程序(由 此处的答案慷慨提供): (define (replace-one list old new)(条件((对?列表)(让 ((nex
..
我对这个概念有点困惑.所以我有以下功能 let rec sumlist lst =与 lst 匹配|[] ->0|(h::t) ->h + (sumlist t) 有延续,可以写成 let rec cont_sumlist lst c =与 lst 匹配|[] ->(c 0)|(h::t) ->cont_sumlist t (乐趣 x -> c (h + x)) 我仍然对 c 的含义和它
..
这是正确折叠的幼稚实现方式: const foldr = f => acc => ([x, ...xs]) => x === undefined ? acc : f(x) (foldkr(f) (acc) (xs)); 这是非尾递归,因此我们无法应用蹦床.一种方法是使算法迭代,并使用堆栈来模仿函数调用堆栈. 另一种方法是将递归转换为CPS: const
..
我一直在尝试理解延续性/CPS,从我的收集中可以得出延迟的计算结果,一旦我们到达列表的末尾,便调用了最终的计算结果. 我不明白的是,为什么CPS阻止了stackoverflow的出现,就像按照示例1中的幼稚方法构建嵌套函数一样.抱歉,冗长的帖子却试图展示这个想法(以及可能的发展方向)错误): 所以: let list1 = [1;2;3] 示例1:“幼稚的方法" let
..
我的目标摘要:弄清楚如何使用连续传递样式来避免使用算法时的堆栈溢出,我认为这种算法无法进行尾递归.或者,找到一种使函数尾部递归的方法. 详细信息: 我是F#(通常是函数式编程)的新手,我正尝试通过alpha-beta修剪实现minimax算法.这是一种算法,用于确定两人游戏的最佳移动方式.可以在以下位置找到该算法的伪代码: https://en.wikipedia. org/wiki/Alp
..
我一直在尝试连续传递样式,因为我可能需要尽快处理一些非尾递归函数。无论如何,要知道的好技术!我在Lua和Clojure中都编写了一个测试函数;在我的小型Android掌上电脑上运行Lua。 Lua版本似乎运行良好,Lua的堆栈深度已经达到300000,但是使用CPS,我当时很容易能够在系统崩溃之前进行超过7000000次迭代,这可能是由于内存不足,而不是CPS / Lua组合没有任何限制。
..
我是Scala的新手,并试图将自己的头缠在延续上 我正在尝试重现yield return C#语句. 这篇文章之后,我编写了以下代码: package com.company.scalatest import scala.util.continuations._; object GenTest { val gen = new Generator[Int] { def
..
我很难理解第145页上的小计划者evens-only*&co的情况. 代码如下: (define evens-only*&co (lambda (l col) (cond ((null? l) (col '() 1 0)) ((atom? (car l)) (cond ((even? (car l)) (evens-
..
有问题的代码是这样的: (define multirember&co (lambda (a lat col) (cond ((null? lat) (col (quote ()) (quote ()))) ((eq? (car lat) a) (multirember&co a (cdr la
..
在阅读《 经验丰富的计划者》 之后,我觉得我对call/cc的理解正确.但是,看到call/cc的一些WOW技巧后,我发现我错了. (define cc 0) (define (f) (call/cc (lambda (k) (set! cc k) 3))) (+ 1 2 4 (f)) ; eval's to 10 (cc 13) ;
..
我正在尝试使用 parsec 编写以下解析器: manyLength :: forall s u m a. Monad m => ParsecT s u m a -> ParsecT s u m Int manyLength p = go 0 where go :: Int -> ParsecT s u m Int go !i = (p *> go (i
..
最近,我一直在重写许多OCaml标准库函数以进行尾递归.鉴于这需要进行直接的CPS转换,我不解为什么不以这种方式编写默认版本. 例如,在标准库中,map定义为: let rec map f = function [] -> [] | a::l -> let r = f a in r :: map f l 我将其重写为: let map f l = let
..
我想知道是否有一种方法可以实现能够处理cps样式函数的通用"memoize"函数(例如,以函数作为输入的函数以及作为输出的函数,例如python的装饰器). /p> 对于普通函数(如“返回结果值,参数仅用于输入!"),备忘录功能可以像在javascript中一样简单 function memoize(fun) { var cache = {}; return functio
..
我无法理解Scheme中收集器功能的使用.我正在使用《小策划者》这本书(丹尼尔·P·弗里德曼和马蒂亚斯·弗莱森).一个有一些解释的综合例子将对我有很大帮助.以下代码段是使用收集器函数的函数示例: (define identity (lambda (l col) (cond ((null? l) (col '())) (else (identity
..