Thunk 在递归 Ocaml 中进行递归

问题描述 投票:0回答:0

给定函数 m(a, b) = 1 如果 n = 0 并且 m(a, b) = m(a-q, m(a,b)) 否则。

我想用thunk来控制这个函数的求值,我就是这么做的。我对这个解决方案的意图是让代码尽可能清晰,尤其是功能代码:

let thunk_ite i t e =
  match i with
  | true -> t ()
  | false -> e () ;;
let rec m_thunk a b = 
  thunk_ite (a() = 0) (fun () -> 1) (fun () -> m_thunk ((fun () -> a() - 1)) (fun () -> (m_thunk a b)));;
let m a b = m_thunk (fun () -> a) (fun () -> b);;
m 1 0;;

这是正确的吗?

给出的解决方案是:

let rec mthunk a b = let r = a() in 
  match r with 
  | 0 -> (fun () -> 1)
  | _-> mthunk (fun () -> r - 1) (fun ()-> (mthunk a b)());;
let m_bis a b = mthunk (fun ()-> a) (fun () -> b) ();;
m_bis 1 0;;

我知道它更短,但我只做了我的版本,所以我可以跟随我的思维过程。

functional-programming ocaml
© www.soinside.com 2019 - 2024. All rights reserved.