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 函数?
答案 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
)并接受参数k
,n
和cb
,后者是(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 = ()