模板 Haskell 和 QuasiQuotes

什麼是模板 Haskell?

模板 Haskell 是指 GHC Haskell 內建的模板超程式設計工具。可以在此處找到描述原始實現的文章。

什麼是階段? (或者,階段限制是什麼?)

階段是指被執行的程式碼。通常,程式碼僅在執行時被啟用,但是使用 Template Haskell,程式碼可以在編譯時執行。 正常程式碼是階段 0,編譯時程式碼是階段 1。

階段限制指的是階段 0 程式可能不會在階段 1 執行 - 這相當於能夠在編譯時執行任何常規程式(不僅僅是元程式)。

按照慣例(並且為了簡化實現),當前模組中的程式碼始終是階段 0,並且從所有其他模組匯入的程式碼是階段 1.因此,只能拼接來自其他模組的表示式。

注意,階段 1 程式是 Q ExpQ Type 等型別的階段 0 表達; 但事實並非如此 - 並非 Q Exp 型別的每個值(第 0 階段計劃)都是第 1 階段計劃,

此外,由於拼接可以巢狀,識別符號可以具有大於 1 的階段。然後可以推廣階段限制 - 階段 n 程式可以不在任何階段 m> n 中執行。例如,在某些錯誤訊息中,可以看到對大於 1 的此類階段的引用:

>: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 |]

使用模板 Haskell 會導致不相關識別符號的範圍內錯誤?

通常,單個 Haskell 模組中的所有宣告都可以被認為是相互遞迴的。換句話說,每個頂級宣告都在單個模組中的每個其他範圍內。當啟用 Template Haskell 時,範圍規則會發生變化 - 而是將模組分成由 TH 拼接分隔的程式碼組​​,每個組是相互遞迴的,並且每個組都在所有其他組的範圍內。