如何导入新类型实例

How to import newtype instance

我将生成记录类型的持久代码提取到一个单独的模块中 (Dao) 我想保持导入干净和严格,所以我尝试从 Dao 模块中显式导入我需要的所有类型和函数。我坚持使用 Key 的 newtype 实例。关键不是我喜欢的类型。它在持久库中定义。

import Dao -- work but it is a mystery how much is imported

GHC (8.6.5) 看起来很聪明,甚至试图帮助我解决问题:

    In module `Dao':
      `RedirectMappingRKey' is a data constructor of `Key'
    To import it use
      import Dao( Key( RedirectMappingRKey ) )
    or
      import Dao( Key(..) )
   |
52 | import Dao (openDbPool, RedirectMappingR(..), RedirectMappingRKey)

但是 GHC 建议的两个版本都被它拒绝了:

    Module `Dao' does not export `Key(RedirectMappingRKey)'
   |
52 | import Dao (openDbPool, RedirectMappingR(..), Key(RedirectMappingRKey))

C:\pro\demo\haskell\servant\myproject\src\Lib.hs:52:47: error: Module `Dao' does not export `Key(..)'
   |
52 | import Dao (openDbPool, RedirectMappingR(..), Key(..))
   |                                               ^^^^^^^

实例定义

*Dao> :i RedirectMappingRKey
newtype instance persistent-2.9.2:Database.Persist.Class.PersistEntity.Key
                   RedirectMappingR
  = RedirectMappingRKey {...}

我运行没主意了,可能合格的进口可以帮我, 但我想知道最好的解决方案。

Key is not my type family. It is defined in persist library

那么你不能从 Dao 导入它,除非 Dao 在其导出列表中特别列出 Key(参见 https://taylor.fausak.me/2016/12/30/automatically-export-haskell-modules/)。为了使用 Key,您必须添加 persistent 库作为依赖项,然后执行 import Database.Persist.Class (Key(..))persistent.

导入它