标签: continuation-passing

F#中的尾递归:堆栈溢出

我正试图在大图上实施Kosaraju的算法作为任务的一部分[MOOC Algo I Stanford on Coursera]

https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm

当前代码适用于小图,但我在运行时执行期间遇到了Stack Overflow.

尽管已经阅读了F#中的Expert相关章节,或者网站上的其他可用示例和SO,我仍然没有得到如何使用continuation来解决这个问题

下面是通用的完整代码,但在执行DFSLoop1和递归函数DFSsub时它已经失败了.我认为我没有使函数tail递归[因为指令

t<-t+1
G.[n].finishingtime <- t
Run Code Online (Sandbox Code Playgroud)

?]

但我不明白我如何正确实施延续.

当仅考虑失败的部分时,DFSLoop1将我们将应用深度优先搜索的图形作为参数.我们需要记录完成时间作为算法的一部分,以便在第二个DFS循环(DFSLoop2)中进入算法的第二部分[当然我们在此之前就失败了].

open System
open System.Collections.Generic
open System.IO

let x = File.ReadAllLines "C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\PA 4 - SCC.txt";;
// let x = File.ReadAllLines "C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\PA 4 - test1.txt";;
// val x : string [] =

let splitAtTab (text:string)=
    text.Split [|'\t';' '|]

let splitIntoKeyValue (A: int[]) = 
    (A.[0], A.[1])

let parseLine (line:string)=
    line
    |> splitAtTab
    |> Array.filter (fun s -> not(s=""))
    |> …
Run Code Online (Sandbox Code Playgroud)

stack-overflow f# tail-recursion continuation-passing kosaraju-algorithm

2
推荐指数
1
解决办法
478
查看次数

如何从具有类型相等约束的 Scott 编码的 GADT 中获取值?

我正在阅读24 天 GHC 扩展的 Rank-N-Types 部分并遇到以下 GADT:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}

import Data.Char

data Some :: * -> * where
    SomeInt  :: Int -> Some Int
    SomeChar :: Char -> Some Char
    Anything :: a -> Some a

unSome :: Some a -> a
unSome (SomeInt x) = x + 3
unSome (SomeChar c) = toLower c
unSome (Anything x) = x

unSome (someInt 2) -- 5
Run Code Online (Sandbox Code Playgroud)

尽管unSome它的类型变量是多态的,但可以向编译器证明在这种SomeInt情况下,将三个添加到给定值是安全的。作者将这种类型称为细化。

现在我很好奇我是否可以用 Scrott …

haskell continuation-passing gadt refinements refinement-type

2
推荐指数
1
解决办法
168
查看次数

ocaml中的持续传递风格

我对这个概念有点困惑.所以我有以下功能

    let rec sumlist lst =
          match lst with
             | [] -> 0
             | (h::t) -> h + (sumlist t)
Run Code Online (Sandbox Code Playgroud)

继续,它可以写成

let rec cont_sumlist lst c =
match lst with
| [] -> (c 0)
| (h::t) -> cont_sumlist t (fun x -> c (h + x))
Run Code Online (Sandbox Code Playgroud)

我仍然对c手段及其作用感到困惑

ocaml continuation-passing

2
推荐指数
2
解决办法
502
查看次数

实施 Cont 应用实例

在实现 的 Applicative 实例时出现以下错误Cont

\n\n
\n

无法将预期类型 \xe2\x80\x98r\xe2\x80\x99 与实际类型 \xe2\x80\x98Cont rb\xe2\x80\x99 \xe2\x80\x98r\xe2\x80\x99 严格匹配类型变量受...约束

\n
\n\n
newtype Cont r a = Cont {(>>-) :: (a -> r) -> r}\n\ninstance Functor (Cont r) where\n  -- fmap :: (a -> b) -> (Cont r) a -> (Cont r) b\n  fmap f (Cont cps_a) = Cont $ \\cps -> cps_a (cps . f)\n\ninstance Applicative (Cont r) where\n  -- pure :: a -> Cont r a\n  pure x = Cont ($ x)\n  -- …
Run Code Online (Sandbox Code Playgroud)

haskell continuation-passing

2
推荐指数
1
解决办法
225
查看次数

`call/cc` 的函数参数是用 CPS 编写的吗?

的参数call/cc是一个过程,其参数是一个延续。程序是用CPS 写的吗?

lisp scheme continuations callcc continuation-passing

2
推荐指数
1
解决办法
291
查看次数

call / cc如何处理“ Lisp in Small Pieces”中的CPS转换?

Lisp in Small Pieces》一书展示了从Scheme到延续通过风格的转变(第5.9.1章,适用于有此书的读者)。转换代表lambda形式的延续,并且call/cc应该等同于简单形式(lambda (k f) (f k k))

我不明白这是怎么工作的,因为在函数的应用和延续之间没有区别。

这是从应用程序以外的所有内容中剥离出来的转换版本(完整版本可以在gist中找到):

(define (cps e)
  (if (pair? e)
      (case (car e)
        ; ...
        (else (cps-application e)))
      (lambda (k) (k `,e))))

(define (cps-application e)
  (lambda (k)
    ((cps-terms e)
     (lambda (t*)
       (let ((d (gensym)))
         `(,(car t*) (lambda (,d) ,(k d))
                     . ,(cdr t*)))))))

(define (cps-terms e*)
  (if (pair? e*)
      (lambda (k)
        ((cps (car e*))
         (lambda (a)
           ((cps-terms (cdr e*))
            (lambda (a*)
              (k (cons a a*))))))) …
Run Code Online (Sandbox Code Playgroud)

lisp scheme continuation-passing

2
推荐指数
1
解决办法
89
查看次数

Haskell CPS:如何使用Cont monad实现map和filter函数?

我一直在努力学习CPS,似乎我并没有真正理解它,你能用Cont monad实现基本的过滤器和地图吗?

haskell map filter continuation-passing

1
推荐指数
1
解决办法
878
查看次数

延续传递风格似乎在Clojure中没有任何区别

我一直在尝试继续传递样式,因为我可能需要尽快处理一些非尾递归函数.无论如何,要知道好的技术!我在Lua和Clojure中编写了一个测试函数; 在我的小型Android掌上电脑上运行Lua.

Lua版本似乎运行良好,Lua的堆栈已经有大约300000的深度,但是使用CPS,我很容易在系统爆炸之前完成超过7000000次迭代,可能是因为缺乏内存,而不是任何限制CPS/Lua组合.

Clojure的尝试表现不太好.只有1000多次迭代,它就是抱怨堆栈爆炸,只需使用普通迭代就可以做得更好,它的堆栈大约为1600,iirc.

任何想法可能是什么问题?JVM固有的东西,或者只是一些愚蠢的noob错误?(哦,BTW,测试功能,sigma(日志)被选中,因为它增长缓慢,Lua不支持Android上的bignums)

所有的想法,提示,建议都非常受欢迎.

Clojure代码:

user=> (defn cps2 [op]
  #_=>   (fn [a b k] (k (op a b))))
#'user/cps2

user=> (defn cps-sigma [n k]
  #_=>  ((cps2 =) n 1 (fn [b]
  #_=>           (if b                    ; growing continuation
  #_=>               (k 0)                ; in the recursive call
  #_=>               ((cps2 -) n 1 (fn [nm1]
  #_=>                        (cps-sigma nm1 (fn [f]
  #_=>                                          ((cps2 +) (Math/log n) f k)))))))))
#'user/cps-sigma

user=> (cps-sigma 1000 identity)
5912.128178488171

user=> (cps-sigma 1500 identity)

StackOverflowError   clojure.lang.Numbers.equal (Numbers.java:216)
user=> …
Run Code Online (Sandbox Code Playgroud)

recursion continuations clojure continuation-passing

1
推荐指数
1
解决办法
285
查看次数

是否有用于重写CPS的宏?

例如,我有两个异步方法

(get-a 10 (lambda (a) (get-b a (lambda (b) (display b)))
Run Code Online (Sandbox Code Playgroud)

但我想写一些类似的东西

(define (a (get-a 10)))
(define (b (get-b a)))
(display b)
Run Code Online (Sandbox Code Playgroud)

scheme continuations functional-programming callcc continuation-passing

0
推荐指数
1
解决办法
140
查看次数