2017-10-31 35 views
1

Ich lerne OCaml in der Schule und kam kürzlich auf ein Programm für eine Aufgabe, die ich nicht verstehen konnte, und hoffte, wenn jemand es mir erklären könnte. Hier ist der Code:OCaml Hinzufügen von natürlichen Zahlen

(* 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) 
    ;; 

Hier ist eine Beispielausgabe für den Code:

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

Was ich nicht verstehe, ist das Spiel-mit-Anweisung. Bedeutet das, dass wenn n1 nicht Null ist, fügt es SUCC hinzu und verwendet [SUCC n1] als neues Argument anstelle von n1 für den rekursiven Aufruf?

Antwort

3

Nein, ist es nicht SUCC n1 als Argument des rekursiven Aufrufs zu verwenden, braucht es nur n1 (den Teil des angepassten SUCC) als Argument. Die SUCC wird dann auf das Ergebnis des rekursiven Aufrufs angewendet. Der Code ist möglicherweise etwas verwirrend, da zwei Variablen mit dem Namen n1 vorhanden sind. Besser könnte sein

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

Vielen Dank! Eine andere Sache, die ich mich gefragt habe, ist, wie weiß die rekursive Funktion wann zu stoppen? – Sean

+1

@Sean Es stoppt, wenn es 'ZERO' erreicht, in diesem Fall wird es sich nicht wieder selbst anrufen – Bergi

+0

Vielen Dank! Jetzt weiß ich, was du meinst, wenn du sagst, dass es verwirrend sein könnte, da das Problem des Scoping ebenfalls ins Spiel kommt. Ich habe heute etwas gelernt. – Sean

Verwandte Themen