2014-07-24 5 views
5

podstawowymi, List.find określa się za pomocą funkcji pomocniczej, w następujący sposób:W OCaml, dlaczego istnieje funkcja pomocnicza na liście Core.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 

Ale może być określona bezpośrednie. Na przykład:

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

Czy jest jakaś zaleta w użyciu funkcję pomocniczą dla definiowania funkcji, takiej jak List.find?

+0

W Haskell dodatkowe możliwości, które można uzyskać, robiąc takie rzeczy, to wielka sprawa. Nie wiem, czy OCaml jest taki sam. Hasła wyszukiwania: statyczna transformacja argumentów, transformacja pracownik-opakowanie –

Odpowiedz

5

W tym przypadku, to nie zmienia się znacznie, ponieważ obie funkcje są ogon rekurencyjnej, ale nadal, odpowiedź na twoje pytanie brzmi:

nazywając find wymaga podjęcia dwóch argumentów. Wywołanie find_aux wymaga podania jednego argumentu. Przekazywanie argumentów nie jest wolne: zajmują miejsce na stosie, ograniczając maksymalną głębokość rekursji, jeśli funkcja nie jest rekursywna, a konfiguracja wymaga czasu.

Jest to kompromis: w wersji Core, należy przydzielić zamknięcie, aby powiązać nazwę f z jej (lokalnie) stałą wartością. Jeśli lista jest krótka, przydzielenie zamknięcia może być droższe niż podanie kilku dodatkowych argumentów (zwłaszcza, że ​​funkcja jest rekursywna).

Zasadniczo nie powinieneś się o to martwić. Prawdopodobnie w tym przypadku nie jest to konieczne i nawet jeśli nie jest to konieczne, nie ma to większego znaczenia.

+0

bardzo zwięzła, ale dokładna odpowiedź. dobrze wiedzieć –