Проблемы с цитированием типов в Haskell - PullRequest
6 голосов
/ 20 сентября 2011

Цитирование TemplateHaskell документирует две кавычки ('') как способ получить Имя типа:

> ''String
GHC.Base.String

Это прекрасно работает для этого типа (имя).Тем не менее, я не могу найти способ заставить его работать хорошо, например, Maybe String:

> ''Maybe String -- interprets String as a data constructor
> ''Maybe ''String -- wants to apply ''String to the Name type

Я знаю, что могу обойти с помощью [t| Maybe String |], но это тогда в монаде Q, итребует изменения типа, и я думаю, что не проверяется типом в соответствующий момент, только при объединении.

Я также могу обойти, сначала определив псевдоним типа, type MaybeString = Maybe String, а затем используя ''MaybeString, но это также громоздко.

Любой способ напрямую получить то, что я хочу, просто через цитату ''?

Ответы [ 2 ]

6 голосов
/ 20 сентября 2011

'' используется для цитирования имен , а не типов. Maybe - это имя, Maybe String - нет. Поэтому неудивительно, что вы должны дать своему типу имя, определив псевдоним типа, прежде чем сможете заключить это имя в кавычки.

[t| |] с другой стороны, кавычки типов . Обратите внимание на разницу здесь.

Prelude> :t ''String
''String :: Language.Haskell.TH.Syntax.Name
Prelude> :t [t| String |]
[t| String |]
  :: Language.Haskell.TH.Syntax.Q Language.Haskell.TH.Syntax.Type

Так что, боюсь, вы не можете использовать '' для того, что вы пытаетесь сделать.

4 голосов
/ 20 сентября 2011

Я думаю, что вы ищете:

ConT ''Maybe `AppT` ConT ''String
...