Ocaml使用let rec in let rec

时间:2018-01-31 21:45:47

标签: ocaml

let k = 2
let n = 4
let rec f i =
  if i >= n then ()
  else (
    let rec q k =
      if 1 = 1 then ()
      else ();;
  );;
f 1;;

当我尝试编译时,出现错误:文件“OCaml.ml”,第8行,字符13-15:错误:语法错误:操作符预期。

如何在 let of rec 函数中使用 let rec 函数?

2 个答案:

答案 0 :(得分:3)

我不会破坏编写完整功能的乐趣,但回答" 如何在let rec函数的其他地方使用let rec函数?":

您错过了in声明:

let k = 2
let n = 4
let rec f i =
  if i >= n then ()
  else
    let rec q k =
      if 1 = 1 then ()
      else ()
    in
    f 1

本地声明的一般模式是:

let identifier = term in expr

如果您需要编写相互递归的函数,则需要and关键字,例如:

let rec f x = g x and g x = f x in "test";;

答案 1 :(得分:1)

这是一个有点难看的解决方案,希望不会让你的老师满意,但这对你开始是有用的。您需要摆脱for循环,找到更好的变量名称并考虑返回值。

comb函数不返回任何内容(unit)并接受参数kncb,后者是(int list -> unit)类型的回调函数1}}为生成的每个组合调用:

let comb k n cb =
  let rec level z seen m = 
    if (z = 0) 
    then (cb seen) 
    else for i = m to n 
         do
           level (z - 1) (i::seen) (i + 1)
         done
   in level k [] 1;;

注意let rec如何用于定义绑定的递归level函数,并且可以从<definition><expression>调用:

let rec level <arguments> = <definition> in <expression>

可能的回调函数是打印结果的函数:

comb 2 4 (fun x -> 
           List.iter 
             (fun c -> print_int c ; print_string " ") 
             (List.rev x) ; 
           print_newline ());;

输出:

1 2                                                                                 
1 3                                                                                 
1 4                                                                                 
2 3 
2 4 
3 4
- : unit = ()