Вот тут подробности:
http://hackage.haskell.org/trac/ghc/wiki/TypeNats/Basics Что из этого можно вывести? А вот, что.
data Field (s :: Symbol) = Field String deriving (Show)
field :: Sing (s :: Symbol) -> Field (s :: Symbol)
field s = Field (fromSing s)
field (Sing "qq") с типом Field "qq" будет отличаться типом от field (Sing "haha") (тип Field "haha"). Их случайно не перепутать.
Понятно, что к таким типам применимы практически все интересные вещи, например, можно задать типы в БД:
type instance FieldType (Field "qq") = Varchar 20 -- здесь другой литерал, целое число.
Помимо Field, можно сделать и Table. К Table подцепить HList полей (с проверкой на отсутствие дубликатов, например) и мы получили описание БД с понятными именами, но без применения магии Template Haskell.