2011-09-06 85 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