2011-09-06 50 views
1

我在理解这个函数的工作原理时遇到了一些问题,特别是我不理解最后一行的控制流程。 有人能解释我的步骤,可能是伪代码吗?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) 
+0

我不确定“关于最后一行的控制流程”是什么意思。最后一行只是调用在它之前的行上定义的函数“f”。 – sepp2k

+0

我想说整个函数的控制流,我不明白为什么最后一行有四个参数,什么是返回值。谢谢你的评论。 – Giovanna

+0

函数f被调用来为元组赋值(teq1,teq2,lneq)? – Giovanna

回答

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的一个快捷方式。

所以当我们谈论一个带两个参数的函数时,我们实际上是在讨论一个函数带一个参数并返回另一个带有另一个参数的函数。同样,一个接受三个参数然后返回另一个参数的函数与使用四个参数的函数是一样的。

f的定义中使用的function关键字是一个语法快捷方式,用于创建一个采用参数和模式匹配的函数。也就是说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相同,可以很容易地将其识别为带有四个参数的函数。

+0

感谢您的帮助。 – Giovanna