我正在为我的所有表使用新键入的键
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')
我现在想在另一个表中对这样一个键有一个可以为null的引用,但我很难。如何将键引用为可为null?
将我的评论与@ForestPoenix的答案结合起来:
Opaleye允许您在运行查询时将Column PGInt8
转换为Int64
。
这意味着它还允许您将Column (Nullable PGInt8)
转换为Maybe Int64
。
您正在将Column (Nullable PGInt8)
包装在Key'
newtype中(为了类型安全(,这将为您提供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)