首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用TemplateHaskell声明Opaleye表

不使用TemplateHaskell声明Opaleye表
EN

Stack Overflow用户
提问于 2018-01-09 19:16:31
回答 1查看 99关注 0票数 0

opaleye basic tutorial提供了一个如何在记录类型和查询中使用用户定义类型的示例:

代码语言:javascript
复制
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" })

使用TemplateHaskell生成函数pBirthday

代码语言:javascript
复制
 $(makeAdaptorAndInstance "pBirthday" ''Birthday')

其中,makeAdaptorAndInstance是在Data.Functor.Product.TH中定义的。

我想避免使用TemplateHaskellopaleye教程简单地参考了Data.Functor.Product.TH的文档,其中只解释了由makeAdaptorAndInstance生成的实例将是:

代码语言:javascript
复制
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的类型为:

代码语言:javascript
复制
pBirthday :: ProductProfunctor p =>
    Birthday (p a a') (p b b') (p c c') -> p (Birthday a b c) (Birthday a' b' c')

但是我找不到任何关于如何手动填充实现这些函数的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-09 19:39:33

GHC有一个-ddump-splices option来查看用我认为这应该是有用的,因为它看起来可能不是太糟糕。(使用-ddump-to-file-dumpdir控制输出位置。)

以下是编写它的一种方法:

代码语言:javascript
复制
instance (ProductProfunctor p, Default p a a', Default p b b') => Default p (Birthday' a b) (Birthday' a' b') where
  def :: p (Birthday' a b) (Birthday' a' b')
  def = pBirthday (Birthday def def)


pBirthday :: ProductProfunctor p =>
  Birthday' (p a a') (p b b') -> p (Birthday a b) (Birthday a' b')
pBirthday (Birthday pa pb) =
  Birthday `rmap` lmap bdName pa **** lmap bdDay pb
  -- It generalizes the applicative construct
  --   "Birthday <$> pa <*> pb"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48167003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档