Warum wurde die Funktionsanwendung als Standard-Haskell-Operator ausgewählt, nicht als Zusammensetzung?

8

Die Haskell-Syntax erfordert relativ lautes f . g $ 3 im Vergleich zu 3 g f wie in stapelorientierten Sprachen. Was waren die wichtigsten Design-Argumente für diese Wahl?

    
Rumca 27.01.2014, 22:32
quelle

4 Antworten

12

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 wir map square [1,2,3] , während wir jede Zahl in eine Liste von Listen schreiben, in die wir map (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.

    
rmmh 27.01.2014, 22:44
quelle
11
  1. Der stack-orientierte Stil macht nicht so viel komponieren wie Sequenz Funktionen; 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 . .
  2. 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.

    %Vor%

    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.

leftaroundabout 27.01.2014 22:54
quelle
2

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.

    
Luis Casillas 29.01.2014 02:50
quelle
1

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.

    
Bartek Banachewicz 27.01.2014 22:37
quelle

Tags und Links