代码之家  ›  专栏  ›  技术社区  ›  REALFREE

Ocaml延续传递样式

  •  6
  • REALFREE  · 技术社区  · 16 年前

    我是ocaml新手,尝试编写一个延续传递样式的函数,但是很困惑我需要传递什么值到k上的附加参数中

    例如,我可以编写一个递归函数,如果列表中的所有元素都是偶数,则返回true,否则返回false。

    所以就像

    let rec even list = .... 
    

    就像这样

    let rec evenk list k = .... 
    

    但我不知道如何处理这个问题,这到底是怎么回事

    例如,对于这个偶数函数,环境看起来像

    val evenk : int list -> (bool -> ’a) -> ’a = <fun>
    
    evenk [4; 2; 12; 5; 6] (fun x -> x)  (* output should give false *)
    
    4 回复  |  直到 13 年前
        1
  •  11
  •   Norman Ramsey    16 年前

    延续 k 是从 evenk 执行“剩余的计算”并生成“答案”。答案是什么类型的,你所说的“计算的其余部分”是什么意思,取决于你使用的是什么样的CPS 对于 . 定制付款服务本身一般不是目的,而是有目的的。例如,在CPS表单中,很容易实现控制操作符或优化尾部调用。如果你不知道你想要完成什么,你很难回答你的问题。

    值得一提的是,如果你只是想从直接式转换到延续传递式,而你所关心的只是答案的值,传递恒等式函数,因为延续是正确的。

    下一个好的步骤是实施 伊万克 如果我有直接风格的功能

    let muladd x i n = x + i * n
    

    如果我假设CPS原语 mulk addk ,我会写

    let muladdk x i n k =
      let k' product = addk x product k in
      mulk i n k'
    

    你会看到复制是先完成的,然后它会继续进行 k' continues 具有 k ,返回给调用者。关键思想是 muladdk k' 表示乘法加法函数的中间点。使你的 伊万克

    我希望这有帮助。

        2
  •  8
  •   George Kangas    16 年前

    let rec even list return =
      if List.length list = 0
        then return true
        else if List.hd list mod 2 = 1
          then return false
          else even (List.tl list) return;;
    
    let id = fun x -> x;;
    

    示例用法:“偶数[2;4; 6; 8] id;;”。

        3
  •  5
  •   Michael Ekstrand    16 年前

    既然你有了 evenk 伊万克

    k v 属于 even 把结果传给 k ,返回 k v 而不仅仅是 v

        4
  •  1
  •   Hugo    15 年前

    您希望将函数的结果作为输入,就好像它不是用延续传递样式编写的一样。

    下面是测试列表是否只有偶数整数的函数:

    (* val even_list : int list -> bool *)
    let even_list input = List.for_all (fun x -> x mod 2=0) input
    

    cont :

    (* val evenk : int list -> (bool -> 'a) -> 'a *)
    let evenk input cont =
      let result = even_list input in
      (cont result)
    

    计算函数的结果,然后通过 result 继续。。。