Как ссылаться на новый ключ в Opaleye как на nullable?

Я использую новые ключи для всех моих таблиц

newtype Key' a = Key a deriving (Show, Generic, Functor)
type Key = Key' Int64
type KeyR = Key' (Column PGInt8)
type KeyW = Key' (Maybe (Column PGInt8))
$(makeAdaptorAndInstance "pKey" ''Key')

Теперь я хочу получить ссылку на такой ключ в другой таблице, но я изо всех сил. Как я могу ссылаться на ключ как обнуляемый?

2 ответа

Решение

Чтобы объединить мои комментарии с ответом @ForestPhoenix:

Opaleye позволяет конвертировать Column PGInt8 в Int64 когда вы запускаете запрос.

Это означает, что он также позволяет конвертировать Column (Nullable PGInt8) в Maybe Int64,

Вы упаковываете Column (Nullable PGInt8) в Key' новый тип (для безопасности типов), который дает вам Key' (Column (Nullable PGInt8)), Это означает, что когда вы запускаете запрос, вам нужно прочитать его как Key' (Maybe Int64),

Может быть, этот столик проясняет переписку:

Opaleye side                  | Haskell side
----------------------------- | -------------
Column PGInt8                 | Int64
Column (Nullable PGInt)       | Maybe Int64
Key' (Column (Nullable PGInt) | Key' (Maybe Int64) 

В общем:

Opaleye side                    | Haskell side
------------------------------- | -------------
Column o                        | h
Column (Nullable o)             | Maybe h
MyNewype' (Column (Nullable o)) | MyNewType' (Maybe h)

Opaleye имеет экземпляр по умолчанию для Nullable PGInt8 в Maybe Int64,

То, что вы пытаетесь сделать, это конвертировать из Key' (Column (Nullable PGInt8)) в Maybe Key = Maybe (Key' Int64),

Чтобы экземпляры по умолчанию работали, вам нужно либо

  • от Key' (Column (Nullable PGInt8))) в Key' (Maybe Int64)

  • от Column (Nullable (Key' PGInt8)) в Maybe Key = Maybe (Key' Int64)

Другие вопросы по тегам