Hasql:编码sum-type

时间:2017-05-23 11:23:02

标签: haskell encoding hasql

如何使用Hasql对以下sum-type进行编码?我尝试创建编码器sumValue :: Value SumValue,但我无法进行模式匹配。例如。我想将SumBoolHasql.Encoders.boolSumChar编码为Hasql.Encoders.char

data SumValue
  = SumBool !(Maybe Bool)
  | SumChar !(Maybe Char)
  | SumDate !(Maybe Day)
  | ...
  | SumUuid !(Maybe UUID)
  deriving (Eq, Show)

1 个答案:

答案 0 :(得分:2)

虽然这似乎很可能是您设计中的错误, 在当前版本的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))