Ocaml,了解一个功能

时间:2011-09-06 07:39:27

标签: recursion ocaml

我在理解这个功能如何工作方面遇到了一些问题, 特别是我不理解它最后一行的控制流程。 有人可以解释一下它的步骤,也许是伪代码吗?

    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)

1 个答案:

答案 0 :(得分:2)

代码的一般流程如下:

首先定义函数traduit_pair。它需要两个参数ab,并返回一个对,其中包含将traduit mark应用于每个参数的结果。

然后定义变量teq1teq2lneq,每个变量包含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 -> e2fun x => case x of | p1 -> e1 | p2 -> e2的捷径。因此let rec f l1 l2 l3 = function | p1 -> e1 | p2 -> e2let 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}}很容易识别为带有四个参数的函数。