Ich lerne gerade Haskell, und da gibt es eine Sache, die mich verblüfft:
Wenn ich einen komplexen Ausdruck erstelle (dessen Berechnung einige Zeit in Anspruch nehmen wird) und dieser Ausdruck konstant ist (dh er besteht nur aus bekannten, fest codierten Werten), wird der Ausdruck zur Kompilierzeit nicht ausgewertet.
Wenn ich von einem C / C ++ - Hintergrund komme, bin ich an diese Art der Optimierung gewöhnt.
Was ist der Grund dafür, dass NOT eine solche Optimierung (standardmäßig) in Haskell / GHC durchführt? Was sind die Vorteile, wenn überhaupt?
%Vor% Da dies immer ausgeben wird True
Ich würde erwarten, dass das kompilierte Programm gedruckt und beendet wird
fast sofort.
Vielleicht möchten Sie diesen reddit-Thread . Der Compiler könnte dies versuchen, aber es könnte gefährlich sein, da Konstanten jeden Typs lustige Dinge wie Loop machen können. Es gibt mindestens zwei Lösungen: Die eine ist die Superkompilierung, die noch nicht als Teil eines Compilers verfügbar ist, aber Sie können Prototypen von verschiedenen Forschern ausprobieren; Am praktischsten ist die Verwendung von Template Haskell, bei dem es sich um den GHC-Mechanismus handelt, mit dem der Programmierer nach Code fragen kann, der zur Kompilierungszeit ausgeführt wird.
Der Prozess, von dem du sprichst, heißt supercompilation und es ist schwieriger, als du es ausgemacht hast. Es ist tatsächlich eines der aktiven Forschungsthemen in der Informatik! Es gibt einige Leute, die versuchen, einen solchen Supercompiler für Haskell zu erstellen (wahrscheinlich basierend auf GHC, mein Speicher ist vage), aber die Funktion ist (noch) nicht in GHC enthalten, weil die Betreuer die Kompilierungszeiten niedrig halten wollen. Sie erwähnen C ++ als eine Sprache, die das tut - C ++ hat auch notorisch schlechte Übersetzungszeiten!
Ihre Alternative zu Haskell besteht darin, diese Optimierung manuell mit Template Haskell durchzuführen, einem Haskells-Kompilierzeit-Makrosystem.
In diesem Fall kann GHC nicht sicher sein, dass die Berechnung beendet wird. Es ist nicht eine Frage von faul gegen streng, sondern eher das Problem der Halt. Für Sie sieht es ganz einfach aus, dass treeFromlist [0..90000]
eine Konstante ist, die zur Kompilierzeit ausgewertet werden kann, aber woher weiß der Compiler das? Der Compiler kann [0..90000]
problemlos auf eine Konstante optimieren, aber Sie würden diese Änderung nicht bemerken.
Tags und Links optimization haskell performance compile-time compile-time-constant