Ответ 1
Оказывается, я делал это неправильно.
После спотыкания Матс Раухала чрезвычайно полезное сообщение в блоге под названием Пример использования HaskellDB, я смог написать тестовый проект, чтобы прочитать записи таблицы books
.
Мне сначала нужно было определить "макет", который, используя haskelldb-th, не так уж плох:
{-# LANGUAGE TemplateHaskell #-}
module Tables.Books (
books
, id
, title
, Books
) where
import Database.HaskellDB.CodeGen
import Prelude hiding (id)
mkDBDirectTable "Books" [
("id", [t|Int|])
, ("title", [t|String|])
]
Оттуда функция allBooks
:
allBooks db = query db $ do
books <- table B.books
return books
где B
- это квалифицированное имя импортируемого модуля Tables.Books
. allBooks
имеет тип:
allBooks :: Database -> IO [Record (Database.HaskellDB.HDBRec.RecCons Tables.Books.Id Int (Database.HaskellDB.HDBRec.RecCons Tables.Books.Title String Database.HaskellDB.HDBRec.RecNil))]
Чтобы распечатать каждый заголовок, я использовал:
main :: IO ()
main = do
books <- postgresqlConnect [("host", "localhost"), ("user", "test"), ("password", "********")] allBooks
mapM_ putStrLn (map (\r -> r!B.title) books)
return ()
EDIT: Я создал репозиторий git, содержащий полные источники этого примера: dtrebbien/haskelldb-example