【发布时间】:2021-04-27 10:21:13
【问题描述】:
以下代码使用 Hedis 运行 mget 命令,并将结果作为 [Maybe BS.ByteString] 返回:
-- | Text to ByteString
tbs :: Text -> BS.ByteString
tbs = BS.pack . T.unpack
-- | ByteString to Text
bst :: BS.ByteString -> Text
bst = T.pack . BS.unpack
mgetRedis :: Redis.Connection -> [Text] -> IO [Maybe BS.ByteString]
mgetRedis connection keys =
runRedis connection action
where
action = do
result <- Redis.mget $ tbs <$> keys
-- `result` is of type `Either Reply [Maybe BS.ByteString]`
case result of
Right values -> pure values
_ -> pure []
首先,我发现这段代码很乱,想知道有没有办法让它更干净。
其次,我希望 mgetRedis 使用上面编写的 bst 帮助器返回 [Maybe Text]。我不能做pure $ bst <$> values,因为这里有两个解包级别:首先是Maybe,然后是List。有没有什么方法可以让这个函数返回所需的类型而不会淹没在嵌套的case 语句的海洋中?
【问题讨论】:
-
T.pack . BS.unpack几乎可以肯定是个坏主意。它不仅很慢(因为中间列表,尽管编译器可能会将其融合掉),而且它也忽略了任何编码问题。text包提供了 dedicated encoders,这使得这一点变得明确。如果请求失败(?),我也觉得返回一个空列表是可疑的。 -
感谢您指出专用编码器 - 对于空列表,我同意,替代方案是将
Either一直带到将处理响应的业务逻辑代码?跨度>