2013-02-12 177 views
0

我是新來ocaml的,我想弄清楚這個功能是如何工作的:Ocaml語法解釋請嗎?

let ccc c1 c2 c3 = fun (s1, s2, s3) n -> 
    let (t1, r1) = (c1 s1 2) in 
     if r1 = 0 
     then let (t2, r2) = (c2 s2 n) in ((t1, t2, s3), r2) 
     else let (t3, r3) = (c3 s3 n) in ((t1, s2, t3), r3) ;; 

c1, c2, c3都是「挑肥揀瘦」。我意識到這個函數的目的是讓3個選擇器進入,讓第一個選擇器選擇其他兩個選擇器中的哪一個使用,但我對語法感到困惑。有誰可以解釋一下嗎?謝謝!

回答

3

如果不知道哪一部分容易混淆,很難回答。以下是一些簡單的例子,展示了一些棘手的部分。

# let f = fun x -> x + 1;; 
val f : int -> int = <fun> 
# f 3;; 
- : int = 4 

這個定義f是一個函數,它將一個整數加到整數上。表達式fun args -> expr定義了一個函數,let將函數綁定到名稱f

# let f x = x + 1 
val f : int -> int = <fun> 
# f 3;; 
- : int = 4 

這定義了相同的函數f。意思完全一樣,它只是一個稍微友好的符號。

無論出於何種原因,您的代碼使用這些符號的這兩個。我不確定我是否有理由這樣做,但它確實強調,如果您將三個函數傳遞給ccc,則會返回一個函數。

其他作品是非常簡單的(儘管也許他們需要一些時間來適應):形成

函數調用只是通過寫彼此相鄰的事情:

c1 s1 2 
c2 s2 n 
c3 s3 n 

這些只是調用c1,c2c3

元組使用逗號(也包括傳統括號)形成。所以(t1, r1)是由c1調用返回的一對值。

我假設你明白了if/then/elseletin。如果不是,他們不難解釋。

我實際上建議閱讀關於OCaml的教程。它應該比在SO上一次提問更高效。有很好的教程在ocaml.org

+0

非常感謝您的回答!我仍然對「s1,s2,s3」是什麼感到困惑。 'n'從哪裏來?最初,我們只將'c1 c2 c3'傳遞給'ccc'功能?謝謝! – pauliwago 2013-02-12 06:33:49

+0

是'c2 s2 n'是帶有兩個參數's2'和'n'的對'c2'的調用。 'n'是內部函數的第二個參數(以'fun'開頭的函數)。 's1','s2'和's3'是由'ccc'返回的函數的第一個參數(一個3元組)的部分。 – 2013-02-12 06:33:52

+0

那麼究竟傳遞給'ccc'的是什麼?除了'(s1,s2,s3),n'外,還有'c1 c2 c3'嗎? – pauliwago 2013-02-12 06:36:37