opaleye
基础教程给出了一个关于如何在记录类型和查询中使用用户定义类型的例子:
data Birthday' a b = Birthday { bdName :: a, bdDay :: b }
type Birthday = Birthday' String Day
type BirthdayColumn = Birthday' (Column PGText) (Column PGDate)
birthdayTable :: Table BirthdayColumn BirthdayColumn
birthdayTable = table "birthdayTable"
(pBirthday Birthday { bdName = tableColumn "name"
, bdDay = tableColumn "birthday" })
函数pBirthday
是使用生成的TemplateHaskell
:
$(makeAdaptorAndInstance "pBirthday" ''Birthday')
makeAdaptorAndInstance
中的定义在哪里Data.Functor.Product.TH
。
我想避免使用TemplateHaskell
. opaleye
教程只是参考了 的文档,Data.Functor.Product.TH
里面只解释了生成的实例makeAdaptorAndInstance
将是:
instance (ProductProfunctor p, Default p a a', Default p b b', Default p c c')
=> Default p (Birthday a b c) (Birthday a' b' c')
并将pBirthday
具有以下类型:
pBirthday :: ProductProfunctor p =>
Birthday (p a a') (p b b') (p c c') -> p (Birthday a b c) (Birthday a' b' c')
但我找不到任何关于如何手动填充实现这些功能的信息。