haskell - Hasql:编码和类型

标签 haskell encoding hasql

如何使用 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))

关于haskell - Hasql:编码和类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44133405/

相关文章:

function - 在 GHCi 中,为什么函数箭头 `:kind (->)` 的类型包含问号 `(->)::?? -> ? -> *` ?

sql - 如何让 Haskell 在编译时检查 SQL?

postgresql - Hasql: 'SET' 语句中的变量替换错误

python - 使用 Python 从原始帧创建 MPEG4 视频文件

haskell - 线程无限期阻塞 - Haskell - Acid State

parsing - 删除基本表达式解析器中的左递归

haskell - 如何处理像 Yesod 这样的 Haskell 框架中的类型

encoding - Spring Boot(1.2.5.RELEASE)Resttemplate 多部分文件上传 UTF-8 文件名不可能

java - mysql/java 字符集问题