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的是什么.
当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)