IIRC die Haskell Wahl der Verwendung von ::
ist ein bisschen ein (unglücklicher) historischer Unfall. Haskell basierte größtenteils auf Miranda, die auch ::
für Typen verwendet. Die Autoren von Miranda wollte wirklich die Nachteile Betreiber :
sein, da sie dachten, es wäre viel mehr ubiquitär verwendet, so dass die Eingabe des Bedieners zu ::
werden delegiert hatte.
Es hat sich wirklich nicht als eine gute Idee erwiesen, da sonst die ganze Literatur (sogar die, die über Haskell spricht) auf Typen :
verwendet. Als nächste paper at hand wird der doppelte Doppelpunkt für alle Muster (Haskell) verwendet, aber die mathematischen Urteile (wie auf Seite 10) folgen alle dem traditionellen einzelnen Doppelpunkt.
Ich glaube, ich erinnere mich, irgendwo (EDIT: es war here, aber ich bin zu faul, um die ganze Sache zu hören, den richtigen Zeitpunkt zu bekommen), dass zu der Zeit, eine Menge FP-Forscher wollten Miranda nur sehr klar definieren, so dass Forschungsberichte, die über faul-funktional-reine Sprachen sprechen, eine gemeinsame Sprache haben könnten, um über ihre Ideen zu sprechen. Die Designer von Miranda wollten das nicht, aber stattdessen sagten sie, dass es ihnen gut gehen würde, wenn dies mit einer anderen Sprache gemacht würde, die Miranda sehr ähnlich sein könnte (vorausgesetzt, dass die beiden Sprachen für beide Parteien noch unterscheidbar sind). . Das war der Ausgangspunkt für den Haskell-Ausschuss.
FWIW, ich betrachte ':: ', um tatsächlich besser in einer Top-Level-Signatur zu lesen, da es ein bisschen mehr Platz zwischen der Wertebene und der Typenebene bringt. 'nicht: Bool -> Bool' sieht ein bisschen aus wie es geparst werden sollte' (nicht: Bool) -> Bool'. Aber viele existierende Infix-Operatoren haben das gleiche Problem; Ich nehme an, dass es im Grunde nur darauf ankommt, was Sie gewohnt sind. – leftaroundabout
Wenn Sie vorgeben, dass eine Typannotation ein tatsächlicher Wert ist, macht '::' Sinn. Es beginnt mit einem ':' wie jeder andere Infix-Konstruktor, es geht dem "echten" Symbol für Typ-Annotationen voraus und gibt einen Namen und einen Typ als Argumente zurück und gibt eine Typ-Annotation zurück. – chepner