OCaml函数传递一个较少的参数

Cha*_*Liu 4 grammar f# ocaml ml pattern-matching

我正在寻找家庭作业的解决方案,代码实现了一个OCaml函数,该函数接受两个参数,但是当它被调用时,它只传递一个参数.

let rec func2 r x = match r with
  | [] -> []
  | (nt,rhs)::t -> if nt = x then rhs::(func2 t x) else func2 t x;;

let func1 r = fun x -> func2 r x;;
Run Code Online (Sandbox Code Playgroud)

我会通过调用(func1 awksub_rules)来调用类似下面的语法规则的func1

let awksub_rules = [
  Expr, [T"("; N Expr; T")"];
  Expr, [N Num];
  Num, [T"0"];
  Num, [T"1"]
]
Run Code Online (Sandbox Code Playgroud)

Expr和Num只是已经定义的非终结类型,T符号表示终端类型.

我很困惑,因为func1只接受awksub_rules作为参数,但函数声明有两个函数.

预期的输出是

function 
  | Expr -> [[T"("; N Expr; T")"]; [N Num]]
  | Num -> [[T"0"]; [T"1"]]
Run Code Online (Sandbox Code Playgroud)

我可以看到func1正确返回一个函数,并且func2处理检查左侧(Expr或Num)是否相同,以便它可以连接到列表.但是我不知道传递给x的是什么.

Fyo*_*kin 6

func1用一个参数调用时,它返回另一个函数,让我们调用它func3:

let func3 = func1 awksub_rules
Run Code Online (Sandbox Code Playgroud)

在这一点上,还没有争论x.这个新函数仍然期望传递这个参数.

当你调用这个新函数时,你将传入值x,并开始计算:

let result = func3 Num
Run Code Online (Sandbox Code Playgroud)

我还想指出这一点func1并且func2在逻辑上是等价的,因为ML中称为" 部分应用 " 的机制.也就是说,您可以使用您使用的func2任何地方func1,并具有相同的效果:

let func3 = func2 awksub_rules
let result = func3 Num
Run Code Online (Sandbox Code Playgroud)