Hasql:编码和类型
Hasql: encode a sum-type
如何使用Hasql对以下sum-type进行编码?我试图创建一个编码器 sumValue :: Value SumValue
,但我无法进行模式匹配。例如。我想用 Hasql.Encoders.bool
编码 SumBool
,用 Hasql.Encoders.char
编码 SumChar
。
data SumValue
= SumBool !(Maybe Bool)
| SumChar !(Maybe Char)
| SumDate !(Maybe Day)
| ...
| SumUuid !(Maybe UUID)
deriving (Eq, Show)
虽然这很可能是您设计中的一个错误,
在当前版本的 Hasql (0.19.*) 中,可以实现这样的编码器
至少在 Params
的水平上。
但是我必须注意到,
除非提供用例,
这证明它很有用,为了类型级安全,将在下一个主要版本中完全删除对此的支持。
无论哪种方式,您现在都可以这样做:
import qualified Hasql.Encoders as A
data SumValue
= SumBool !(Maybe Bool)
| SumChar !(Maybe Char)
| SumDate !(Maybe Day)
| SumUuid !(Maybe UUID)
deriving (Eq, Show)
sumValue :: A.Params SumValue
sumValue =
contramap match $
chosen (A.nullableValue A.bool) $
chosen (A.nullableValue A.char) $
chosen (A.nullableValue A.date) $
A.nullableValue A.uuid
where
match =
\case
SumBool x -> Left x
SumChar x -> Right (Left x)
SumDate x -> Right (Right (Left x))
SumUuid x -> Right (Right (Right x))
如何使用Hasql对以下sum-type进行编码?我试图创建一个编码器 sumValue :: Value SumValue
,但我无法进行模式匹配。例如。我想用 Hasql.Encoders.bool
编码 SumBool
,用 Hasql.Encoders.char
编码 SumChar
。
data SumValue
= SumBool !(Maybe Bool)
| SumChar !(Maybe Char)
| SumDate !(Maybe Day)
| ...
| SumUuid !(Maybe UUID)
deriving (Eq, Show)
虽然这很可能是您设计中的一个错误,
在当前版本的 Hasql (0.19.*) 中,可以实现这样的编码器
至少在 Params
的水平上。
但是我必须注意到,
除非提供用例,
这证明它很有用,为了类型级安全,将在下一个主要版本中完全删除对此的支持。
无论哪种方式,您现在都可以这样做:
import qualified Hasql.Encoders as A
data SumValue
= SumBool !(Maybe Bool)
| SumChar !(Maybe Char)
| SumDate !(Maybe Day)
| SumUuid !(Maybe UUID)
deriving (Eq, Show)
sumValue :: A.Params SumValue
sumValue =
contramap match $
chosen (A.nullableValue A.bool) $
chosen (A.nullableValue A.char) $
chosen (A.nullableValue A.date) $
A.nullableValue A.uuid
where
match =
\case
SumBool x -> Left x
SumChar x -> Right (Left x)
SumDate x -> Right (Right (Left x))
SumUuid x -> Right (Right (Right x))