Локальные переменные в объявлениях шаблона Haskell

125
12

Я читаю pozorvlak baby step post на Template Haskell в попытке понять это сам, и я наткнулся на этот раздел:


Напомним, что мы пытались программно создавать декларации формы data Fred = Fred. Попробуем его с квазикотажем. Из-за ограничений на вызов кода TH нам придется поместить его в свой собственный модуль, поэтому поставьте следующее в Keyword.hs, чтобы компилятор мог его найти:


module Keyword (keyword) where

import Language.Haskell.TH.Syntax
keyword name = [d| data $(name) = $(name) |]

Теперь скомпилируйте:


Prelude> :l Keyword.hs
[1 of 1] Compiling Keyword ( Keyword.hs, interpreted )

Keyword.hs:6:24: parse error on input `$('



Эта ступенька со мной звонила и казалась похожей на что-то еще, что я недавно читал, документация пакета Template Haskell:


Для динамически связанной вещи (NameS) мы, вероятно, хотим, чтобы они зависели от контекста, поэтому нам больше не нужно пространство имен. Например:


let v = mkName "T" in [| data $v = $v |]

Здесь мы используем те же Name для конструктора типов и конструктора данных



Ну, это почти то же самое, пусть посмотрим, смогу ли я заставить это работать:


 module Example where
import Language.Haskell.TH
let v = mkName "T" in [| data $v = $v |]

Дайте ему вихрь:


 % ghc -XTemplateHaskell -c Example.hs

Example.hs:3:25: parse error on input `data'


Хм... О, может, мне нужно использовать объявление d для объявления?


 let v = mkName "T" in [d| data $v = $v |]

и теперь:


 Example.hs:3:31: parse error on input `$v'

Итак... что происходит? Использование явных сплайсов не изменяет ни одну из ошибок. Я беру документацию Template Haskell из контекста, или это просто неправильно?

спросил(а) 2021-01-25T17:44:40+03:00 5 месяцев назад
1
Решение
100

Похоже, что это ошибка с версиями GHC старше 6.12, где вы не можете сращиваться в типах.

ответил(а) 2021-01-25T17:44:40+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема