Looking for haskell Keywords? Try Ask4Keywords

Haskell LanguageVorlage Haskell & QuasiQuotes


Bemerkungen

Was ist Template Haskell?

Template Haskell bezieht sich auf die in GHC Haskell integrierten Template-Metaprogrammierungsfunktionen. Das Papier der ursprüngliche Implementierung der Beschreibung gefunden werden kann hier .

Was sind Stufen? (Oder was ist die Bühneneinschränkung?)

Stufen beziehen sie auf , wenn der Code ausgeführt wird. Normalerweise wird Code nur zur Laufzeit ausgeführt, aber mit Template Haskell kann Code zur Kompilierzeit ausgeführt werden. "Normal" -Code ist Stufe 0 und der Kompilierzeitcode ist Stufe 1.

Die Einschränkung der Stufe bezieht sich auf die Tatsache, dass ein Stufe 0-Programm möglicherweise nicht auf Stufe 1 ausgeführt werden kann. Dies wäre gleichbedeutend mit der Möglichkeit, ein normales Programm (nicht nur ein Meta-Programm) zur Kompilierzeit auszuführen.

Konventionell (und der Einfachheit der Implementierung halber) ist Code im aktuellen Modul immer Stufe 0 und Code, der von allen anderen Modulen importiert wird, Stufe 1. Aus diesem Grund dürfen nur Ausdrücke aus anderen Modulen gespleißt werden.

Beachten Sie, dass ein Programm der Stufe 1 ein Ausdruck der Stufe 0 des Typs Q Exp , Q Type usw. ist. aber das Gegenteil ist nicht wahr - nicht jeder Wert (Programm der Stufe 0) vom Typ Q Exp ist ein Programm der Stufe 1,

Da Spleiße verschachtelt werden können, können Identifizierer außerdem Stufen haben, die größer als 1 sind. Die Stufenbeschränkung kann dann verallgemeinert werden - ein Programm der Stufe n kann in keiner Stufe m> n ausgeführt werden . Beispielsweise können in bestimmten Fehlermeldungen Verweise auf solche Stufen größer als 1 angezeigt werden:

>:t [| \x -> $x |]

<interactive>:1:10: error:
    * Stage error: `x' is bound at stage 2 but used at stage 1
    * In the untyped splice: $x
      In the Template Haskell quotation [| \ x -> $x |]

Die Verwendung von Template Haskell führt zu Fehlern außerhalb des Gültigkeitsbereichs von nicht verknüpften Bezeichnern.

Normalerweise können alle Deklarationen in einem einzigen Haskell-Modul als gegenseitig rekursiv betrachtet werden. Mit anderen Worten, jede Deklaration auf oberster Ebene ist in einem einzigen Modul im Umfang jeder anderen. Wenn Template Haskell aktiviert ist, ändern sich die Bereichsregeln. Stattdessen wird das Modul in durch TH-Spleiße getrennte Codegruppen aufgeteilt, und jede Gruppe ist wechselseitig rekursiv. Jede Gruppe befindet sich im Bereich aller weiteren Gruppen.

Vorlage Haskell & QuasiQuotes Verwandte Beispiele