2012-12-12 22 views
8

Czytałem dziś książkę online Jason'a Hickey'a "Wprowadzenie do Objective Caml" oraz w rozdziale o funktorach (strona 140) Wbiegłem do poniższej linii wewnątrz zestawu funktora definicja:W OCaml, dlaczego konstruktor listy :: nie jest operatorem

let add = (::) 

Uruchomienie kodu zaowocowało niezbyt pouczającym komunikatem o błędzie "Składnia błędu". Po wtyczce w wierszu do tablicy informacyjnej zorientowałem się, że :: nie jest w rzeczywistości operatorem, ale raczej konstruktorem typu.

Jednak z tego, co wiem o Haskellu, równoważny konstruktor : może być również traktowany jako operator (funkcja).

Prelude> :t (:) 
(:) :: a -> [a] -> [a] 

Moje pytanie brzmi: czy konstruktorzy SML nigdy nie było wartości klasy pierwsze (co oznacza, że ​​kod z książki myliłem od początku) i dlaczego tak się dzieje?

+0

Zwykle używam '(fun x y -> x :: y)', aby rozwiązać ten problem (przekształca operatora na lambda). To trochę denerwujące, ale działa. Ponadto, nawet jeśli '::' byłaby funkcją, nadal musiałbyś robić to samo, gdy potrzebujesz argumentów dla '::' zamienionych, więc myślę, że to ma sens w tym względzie. –

Odpowiedz

10

W Caml Light, poprzedniku OCamla, było tak, że konstruktorzy, którzy awansowali do funkcji po częściowym zastosowaniu. Nie jestem do końca pewien, dlaczego ta funkcja została usunięta podczas przechodzenia do OCaml, i ja też lamentuję, ale wyjaśnienie, które usłyszałem, brzmiało "nikt tego nie używał". Więc nie ma już List.map Some foo ...

:: jest nieco specjalny jako algebraiczną konstruktora typu danych, jak to jest tylko konstruktor infix (ustalony w parser), ale inaczej zachowuje się jak każdy inny konstruktor typu danych.

+0

Nie pamiętam, żeby usłyszałem wyjaśnienie "nikt nie użył tego". Myślę, że motywacją było podkreślenie różnicy między funkcjami a konstruktorami ... – lukstafi

+1

To interesujące. Równolegle czytam "Funkcjonalne podejście do programowania" przy użyciu Caml Light i na kilka razy okazało się, że język jest ładniejszy niż OCaml (domyślne dopasowanie do wzorca dla zabawy, definicja formy, wbudowany operator składu funkcji). – PetarMarendic

+3

Xavier odpowiedział ponad 10 lat temu: http://caml.inria.fr/pub/ml-archives/caml-list/2001/08/47db53a4b42529708647c9e81183598b.fr.html – camlspotter

Powiązane problemy