我在理解这个功能如何工作方面遇到了一些问题, 特别是我不理解它最后一行的控制流程。 有人可以解释一下它的步骤,也许是伪代码吗?
let traduit_pair a b =
let a = traduit mark a in let b = traduit mark b in (a, b) in
let (teq1, teq2, lneq) =
let rec f l1 l2 l3 =
(function
| [] -> ((Uplet l1), (Uplet l2), l3)
| EqualIF (a, b) :: fin ->
let (a, b) = traduit_pair a b
in f (a :: l1) (b :: l2) l3 fin
| NotEqualIF (a, b) :: fin ->
let (a, b) = traduit_pair a b
in f l1 l2 ((a, b) :: l3) fin)
in f [] [] [] (List.rev condlst)
答案 0 :(得分:2)
代码的一般流程如下:
首先定义函数traduit_pair
。它需要两个参数a
和b
,并返回一个对,其中包含将traduit mark
应用于每个参数的结果。
然后定义变量teq1
,teq2
和lneq
,每个变量包含f [] [] [] (List.rev condlst)
返回的三元组的一个元素,其中f
定义为如下:
首先让我们看看为什么f
可以用四个参数调用,当它的定义只命名三个参数时:你可能知道ML允许curried函数定义而定义let f x y = blabla
实际上只是一个let f = fun x => fun y => blabla
的快捷方式。
因此,当我们讨论一个带有两个参数的函数时,我们真正讨论的是一个函数接受一个参数并返回另一个带有另一个参数的函数。同样,一个函数接受三个参数然后返回另一个函数接受另一个参数,这与一个带有四个参数的函数是一样的。
function
定义中使用的f
关键字是一种语法快捷方式,用于创建一个在其上进行参数和模式匹配的函数。也就是说function | p1 -> e1 | p2 -> e2
是fun x => case x of | p1 -> e1 | p2 -> e2
的捷径。因此let rec f l1 l2 l3 = function | p1 -> e1 | p2 -> e2
与let rec f l1 l2 l3 = fun l4 => case l4 of | p1 -> e1 | p2 -> e2
相同,let rec f l1 l2 l3 l4 = case l4 of | p1 -> e1 | p2 -> e2
与{{1}}相同,{{1}}很容易识别为带有四个参数的函数。