2012-09-22 4 views
7

Ich habe die Definition für und im Internet gefunden, aber ich konnte die tatsächliche Implementierung von und nicht finden. Ich habe nach einer Art Präludium-Haskell-Datei auf meinem Computer gesucht, aber es gab nichts zurück, was in einem Texteditor geöffnet werden konnte.Wie kann ich den Implementierungscode für "und" sehen?

Antwort

19

Sie Hoogle verwenden können, für Haskell-Funktionen zu suchen, etwa so:

http://www.haskell.org/hoogle/?hoogle=and

Die Funktion Links gelangen Sie in die Bibliothek Modul, in dem die Funktion definiert wurde, und in diesem Fall ist die Verbindung für and nimmt uns hier:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:and

Sie dann auf den Source Link auf der rechten Seite des Funktionsnamens und es nehmen s du zur Quelle dieser Funktion. Für den Fall von and verbindet es uns hier:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-List.html#and

and      :: [Bool] -> Bool 
or      :: [Bool] -> Bool 
#ifdef USE_REPORT_PRELUDE 
and      = foldr (&&) True 
or      = foldr (||) False 
#else 
and []   = True 
and (x:xs)  = x && and xs 
or []   = False 
or (x:xs)  = x || or xs 
#endif 

Sie werden sehen, dass and zwei Definitionen tatsächlich hat. Eine ist die Standard-Prelude-Definition, die nur aktiviert wird, wenn Sie mit dem USE_REPORT_PRELUDE-Flag kompilieren, und die andere ist die Definition, mit der das Prelude normalerweise kompiliert wird, die normalerweise optimiert ist.

+3

Neugier: Was ist der Sinn der beiden Definitionen? –

+1

@ChrisTaylor Ich habe keine Ahnung. Ich gehe einfach davon aus, dass die Leute, die die Basisbibliotheken optimieren, einen guten Grund haben, all diese zusätzlichen Zeichen einzugeben. –

+1

Lustig, es gibt ein RULES-Pragma nach diesem Code, der ihm im Wesentlichen sagt, dass er vorgibt, die USE_REPORT_PRELUDE-Version für das Build/Foldr-Neuschreiben zu verwenden –

2

Sie können nicht erwarten, den Quellcode in Ihrer lokalen Distribution von Haskell zu finden - das ist wahrscheinlich Haskell Platform. Gehen Sie stattdessen zu Hoogle und suchen Sie nach der Funktion. Eine Möglichkeit, die Sie haben möchten, ist, nach dem Namen and zu suchen, zu seinem Haddock zu gehen und dann auf "Quelle" zu klicken.

In Hoogle können Sie auch nach Typ Signatur suchen, dh. [Bool] -> Bool was Sie wahrscheinlich oft tun werden.

Verwandte Themen