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?
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. –