2015-07-01 7 views
5

definieren Ich betrachte die pipes Bibliothek Quellcode und zum Beispiel in den Core module Ich verstehe nicht, warum der Autor ganz über den Platz ist das Muster der Definition von Funktionen wie die Verwendung von:warum Rohre innere Funktionen

runEffect = go 
    where 
    go p = ... 

Oder:

pull = go 
    where 
    go a' = ... 

Oder:

reflect = go 
    where 
    go p = ... 

I Ist das ein Trick, um einige Optimierungen zu ermöglichen? Ich finde es hässlich, wenn es ein Optimierungstrick ist, möchte ich wirklich, dass der Compiler es ohne solche Dinge machen könnte. Aber vielleicht gibt es noch einen anderen Grund?

Antwort

7

GHC wird nur inline nicht-rekursive Funktionen und nur dann, wenn sie aus syntaktischer Sicht "vollständig angewendet" sind (dh an der Aufrufstelle werden sie auf die Anzahl der Argumente angewendet, die auf der linken Seite erscheinen) die Definition).

In den von Ihnen veröffentlichten Beispielen gibt es keine Argumente, die Definitionen sind jedoch wahrscheinlich rekursiv und würden nicht inline sein. Diese Transformation ermöglicht wahrscheinlich, dass die Definitionen an der Aufrufstelle inline und spezialisiert sind (für die konkreten Typen von m usw.).

Ist das ein Trick, um einige Optimierungen zu ermöglichen? Ich finde es hässlich, wenn es ein Optimierungstrick ist Ich wünschte wirklich, der Compiler könnte es tun ohne solche Dinge.

Ja, es ist super lahm.

+2

'pipes' ist eine kleine Bibliothek mit zusammensetzbaren Abstraktionen, mit denen viele komplexe Logiken erstellt werden können. Daher lohnt es sich natürlich, dass sich die Optimierung auf der Ebene der Core-Bibliothek auszahlt. Es hat auch nichttriviale Umschreibungsregeln. Im Gegensatz dazu müssen wir uns im normalen Produktionscode nicht mit manuellen Wrapper beschäftigen. GHC macht das normalerweise gut. –

+1

Danke. Dank deiner Keywords "voll angewendet" bin ich nun auf folgendes gestoßen: http://stackoverflow.com/questions/11690146/why-does-gh-c-consider-the-lhs-syntaktisch-wenn-inlining was ich hoffentlich teilen werde ein bisschen mehr Licht auf das Thema für mich. Es ist ziemlich enttäuschend, wenn man all die andere Magie sieht, die Haskell erreichen kann. –

+0

Wenn es so einfach ist, eine rekursive Funktion zu "inline" zu machen, warum macht GHC diesen Trick nicht selbst? – mb14