Das könnte auch f (g 3)
geschrieben werden.
Warum ist Haskell keine konkatenative Sprache?
Basiert auf Eine Geschichte von Haskell , wurde es durch eine Vielzahl von funktionalen Programmierung und faulen Sprachexperimente, einschließlich ML beeinflusst. Wie Abschnitt 4 beschreibt Syntax:
Curry
Einer Tradition folgend, die auf Frege zurückgeht, kann eine Funktion von zwei Argumenten als Funktion eines Arguments dargestellt werden, das selbst eine Funktion eines Arguments zurückgibt. Diese Tradition wurde von Moses Schönfinkel und Haskell Curry verfeinert und wurde als Curry bezeichnet. Funktionsanwendung wird durch Juxtaposition und Associates nach links bezeichnet. Daher wird
f x y
analysiert(f x) y
. Dies führt zu prägnantem und leistungsfähigem Code. Um beispielsweise jede Zahl in einer Liste zu quadrieren, schreiben wirmap square [1,2,3]
, während wir jede Zahl in eine Liste von Listen schreiben, in die wirmap (map square) [[1,2],[3]]
schreiben. Haskell unterstützt, wie viele andere auf Lambda-Kalkül basierende Sprachen, Curry- und Uncurried-Definitionen,
Das Konzept des Currying ist so zentral für Haskells Semantik und das Lambda-Kalkül in seinem Kern, dass jede andere Methode der Anordnung schlecht mit der Sprache zusammenwirken würde.
3 g f
ist eine solche Sprache ist eher f $ g $ 3
in Haskell. Natürlich entspricht das f . g $ 3
, aber es funktioniert nur so lange, wie Sie die Komposition sofort auf einen Wert anwenden. In Haskell komponieren Sie sehr oft Funktionen, um sie an einen übergeordneten Kombinator zu übergeben oder eine point-free Definition zu erstellen. In einer Stack-orientierten Sprache, die eine explizite Blockierung benötigt, benötigt sie in Haskell nur den Operator .
. Normalerweise verkettet man nicht nur "atomare" Funktionen. Sicher, Sie beschäftigen sich nicht mit global benannten Ein-Buchstaben-Funktionen, so dass die winzigen .
oder $
nicht wirklich einen dramatischen Unterschied machen. Und sehr oft, wie rmmh sagte, haben Sie teilweise angewendete Funktionen, z. B.
Das ist viel mühsamer ohne billige, eng bindende Anwendung. Außerdem ist es sehr natürlich, wenn Sie das .
trennen, um zu markieren, was nicht sofort angewendet wird, sondern nur zusammengesetzt.
Wenn Sie sich für die Geschichte von Haskell, Hudak, Hughes, Peyton Jones & amp; Wadlers "Eine Geschichte von Haskell: Faul sein mit Klasse" ist das bekannteste Papier zu diesem Thema und lohnenswert.
Es geht nicht direkt auf Ihre Frage ein, aber es weist auf eine sehr relevante Tatsache hin: Haskell wurde als verbindender Kompromiss zwischen einer Reihe bestehender Sprachen aus kleinen Teams geschaffen. Zitat von Abschnitt 2.2 ("Ein Turm von Babel"):
Als Ergebnis all dieser Aktivitäten gab es Mitte der 1980er Jahre eine Reihe von Forschern, darunter auch die Autoren, die sowohl an Design- als auch an Implementierungstechniken für reine, faule Sprachen interessiert waren. Tatsächlich hatten viele von uns unabhängig voneinander unsere eigenen faulen Sprachen entwickelt und waren eifrig dabei, unsere eigenen Implementierungen für sie zu entwickeln. Wir haben jeweils über unsere Bemühungen geschrieben, in denen wir zuerst unsere Sprachen beschreiben mussten, bevor wir unsere Implementierungstechniken beschreiben konnten. Sprachen, die zu diesem faulen Turm von Babel beigetragen haben, sind:
- Miranda [...]
- Lazy ML (LML) [...]
- Orwell [...]
- Alfl [...]
- Id [...]
- Säubere [...]
- Nachdenken [...]
- Daisy [...]
Die Antwort könnte einfach sein, dass Haskell dies aus seinen Vorgängersprachen kopiert hat. Und da einige dieser Sprachen wiederum von Lisp und ML inspiriert oder inspiriert waren, können sie sie analog von ihnen kopiert haben. Also zurück, um deine Frage zu zitieren:
Was waren die wichtigsten Argumente für diese Entscheidung?
Die Chancen stehen gut, dass es für die Wahl nie ein nachhaltiges Argument gab. Nur sehr wenige Hochsprachen haben sich für das Stack-basierte Design entschieden, und nur wenige kennen sie.
Meine Vermutung wäre Lambda-Kalkül und Nützlichkeit (in realen Szenarien).
In der Lambda-Kalkül, Raum ist Anwendung, und so fühlt es sich mehr wie Menschen, die es wissen.
In den am häufigsten verwendeten Sprachen ist es üblich, eine Funktion anzuwenden. Haskell ist keine Stack-basierte Sprache, daher wurde die Wahl dort getroffen.
Tags und Links haskell