2013-11-16 2 views
2

Я пытаюсь заставить голову обернуться вокруг Стойкий, и одна из вещей, которую я пытаюсь изучить, это derivePersistField шаблон haskell. Теперь я понимаю, что существует ограничение на сцену, заставляя GHC отображать остальную часть кода, который должен генерировать квазикватер, но мой просто не делает этого. GHC продолжает жаловаться, что вызов функции находится на верхнем уровне, но я еще не знаю, чтобы генерировать фактические типы данных + хорошие биты. Вот мой код (взято непосредственно из книги Йесод на Persistent):Обнаженное выражение на верхнем уровне для простого эксперимента Template Haskell

--Employment.hs ----

module Employment where 

import Database.Persist.TH 

data Employment = Employed | Unemployed | Retired 
    deriving (Show, Read, Eq) 
derivePersistField "Employment" 

--main.hs ----------

{-# LANGUAGE QuasiQuotes, TypeFamilies, GeneralizedNewtypeDeriving, TemplateHaskell, 
      OverloadedStrings, GADTs, FlexibleContexts #-} 
import Database.Persist.Sqlite 
import Database.Persist.TH 
import Employment 

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
Person 
    name String 
    employment Employment 
|] 

main = runSqlite ":memory:" $ do 
    runMigration migrateAll 

    insert $ Person "Bruce Wayne" Retired 
    insert $ Person "Peter Parker" Unemployed 
    insert $ Person "Michael" Employed 

Что еще мне не хватает? Нужно ли добавлять языковые расширения в модуль? Любая помощь будет принята с благодарностью!

+0

Вам нужно поставить вызовы функций верхнего уровня в выражении TH: '$ (derivePersistField« Занятость »)'. Или, может быть, '$ (derivePersistField '' Employment)' (двойной тик цитирует тип) То же самое для вызова 'share', я думаю. – luqui

ответ

1

derivePersistField - это шаблон сплайна Haskell, например share, поэтому для его использования в модуле вам необходимо включить языковой прагма TemplateHaskell. То есть

{-# LANGUAGE TemplateHaskell #-} 

module Employment where 

import Database.Persist.TH 

data Employment = Employed | Unemployed | Retired 
    deriving (Show, Read, Eq) 
derivePersistField "Employment" 

Вы также можете включить расширение для всего проекта, поставив

extensions: TemplateHaskell 

в .cabal -файла вашего проекта, но рекомендуемый способ, чтобы включить расширения, нужно на базе одного модуля.

+0

Большое вам спасибо, что исправил мою проблему! –

Смежные вопросы