2014-07-24 3 views
5

Im Kern ist List.find unter Verwendung einer Hilfsfunktion definiert ist, wie folgt: kannWarum gibt es in OCaml eine Hilfsfunktion in List.find?

let find l ~f = 
    let rec find_aux = function 
    | []  -> None 
    | hd :: tl -> if f hd then Some hd else find_aux tl 
    in 
    find_aux l 

Aber es direkt festgelegt werden. Zum Beispiel:

let rec find l ~f = 
    match l with 
    | []  -> None 
    | hd :: tl -> if f hd then Some hd else find tl f 

Gibt es einen Vorteil in eine Hilfsfunktion mit einer Funktion wie List.find für die Definition?

+0

In Haskell sind die zusätzlichen inlining Möglichkeiten, die Sie bekommen, indem Sie so etwas tun, eine große Sache. Ich weiß nicht, ob OCaml das gleiche ist. Suchbegriffe: statische Argumentumwandlung, Worker-Wrapper-Transformation –

Antwort

5

In diesem Fall ist es nicht viel ändern, da beide Funktionen Schwanz-rekursiv sind, aber immer noch, ist die Antwort auf Ihre Frage:

find Aufruf zwei Argumente zu übergeben erfordert. Der Aufruf von find_aux erfordert die Übergabe eines Arguments. Das Übergeben von Argumenten ist nicht frei: Sie belegen Platz auf dem Stapel und begrenzen die maximale Rekursionstiefe, wenn die Funktion nicht tail-rekursiv ist und sie brauchen Zeit zum Einrichten.

Es ist ein Kompromiss: In der Core-Version muss eine Schließung zugeordnet werden, um den Namen f an seinen (lokal) permanenten Wert zu binden. Wenn die Liste kurz ist, kann das Zuweisen des Abschlusses teurer sein als das Übergeben einiger zusätzlicher Argumente (insbesondere, da die Funktion tail-rekursiv ist).

Grundsätzlich sollten Sie sich keine Sorgen machen. Es ist in diesem Fall wahrscheinlich unnötig, und selbst wenn es nicht unnötig ist, macht es keinen großen Unterschied.

+0

sehr knappe, aber gründliche Antwort. gut zu wissen –

Verwandte Themen