2017-10-31 7 views
1

私は学校でOCamlを学んでいますが、最近私は理解できない課題のためのプログラムを見つけ、誰かが私に説明できるかどうかを期待していました。ここでは、コードがあります:OCaml自然数を追加する

(* Natural numbers can be defined as follows: 
    type = ZERO | SUCC of nat;; 

    For instance, two = SUCC (SUCC ZERO) and three = SUCC (SUCC (SUCC ZERO)). 

    Write a function 'natadd' that adds two natural numbers in this fashion. *) 

# type = ZERO | SUCC of nat;; 
# let two = SUCC (SUCC ZERO);; 
# let three = SUCC (SUCC (SUCC ZERO));; 
# let rec natadd : nat -> nat -> nat = 
    fun n1 n2 -> 
     match n1 with 
     | ZERO -> n2 
     | SUCC n1 -> SUCC (natadd n1 n2) 
    ;; 

ここでは、コードのサンプル出力です:

# natadd two three;; 
- : nat = SUCC (SUCC (SUCC (SUCC (SUCC ZERO)))) 

私は理解していないものと一致し-と文です。 n1が非ゼロの場合、SUCCを追加し、再帰呼び出しではn1の代わりに[SUCC n1]を新しい引数として使用することを意味しますか?

答えて

3

いいえ、再帰呼び出しの引数にSUCC n1を使用せず、n1(一致する部分)を引数として使用します。 SUCCは、再帰呼び出しの結果に適用されます。

名前がn1の2つの変数があるため、コードが混乱する可能性があります。良いかもしれない

let rec natadd : nat -> nat -> nat = fun a b -> 
    match a with 
    | ZERO -> b 
    | SUCC a_pred -> SUCC (natadd a_pred b) 
+0

ありがとう!私が疑問に思っていたもう1つのことは、再帰関数がどのように停止するかを知っていますか? – Sean

+1

@Sean ZEROに達したときに停止します。その場合は、再度呼び出しません。 – Bergi

+0

ありがとうございました!スコープの問題も出てくるので、混乱するかもしれないと言ったときの意味を理解しています。私は今日何かを学んだ。 – Sean

関連する問題