Как импортировать экземпляр нового типа - PullRequest
2 голосов
/ 06 января 2020

Я извлек постоянный код, генерирующий типы записей, в отдельный модуль (Dao), и я хочу сохранить импорт чистым и строгим, поэтому я попытался явно импортировать все нужные мне типы и функции из модуля Dao. Я застрял с экземпляром нового типа для ключа. Ключ не мой тип семьи. Это определено в постоянной библиотеке.

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

GH C (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)

, но обе версии предложенный GH C отвергается им:

    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 {...}

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

1 Ответ

4 голосов
/ 06 января 2020

Ключ - не моя типовая семья. Он определен в постоянной библиотеке

Тогда вы не сможете импортировать его из Dao, если только Dao специально не перечислит Key в своем списке экспорта (см. https://taylor.fausak.me/2016/12/30/automatically-export-haskell-modules/). Чтобы использовать Key, необходимо добавить библиотеку persistent в качестве зависимости, а затем выполнить import Database.Persist.Class (Key(..)), чтобы импортировать ее из persistent.

...