gpt4 book ai didi

Haskell 从 IO 中提取长度(回复 [Data.ByteString.Internal.ByteString])

转载 作者:IT王子 更新时间:2023-10-29 06:03:34 24 4
gpt4 key购买 nike

需要从已离开的开发人员那里修补 Haskell 项目,但我是一个完整的 Haskell 菜鸟。

尝试编写一个函数来返回与某个模式匹配的所有 Redis 键的数量。交互地,它看起来像这样:

*MyProj S R U>let res = runRedis conn $ keys "MP:Users*"
*MyProj S R U> res
Right ["MP:Users:00:13:95:12:7D:85","MP:Users:00:13:95:12:7D:84","MP:Users:APP"]
*MyProj S R U> :t res
res :: IO (Either Reply [Data.ByteString.Internal.ByteString])

所以在这种情况下,我只需要来自 Redis 的 Right ByteString 数组响应的长度。 3 在这种情况下。任何问题或无响应,此函数只能返回 0。

我真的不知道如何在 Haskell 中执行此操作,我能想到的最接近的是:

redisKeyCount :: Connection -> BSC.ByteString -> IO Int
redisKeyCount conn keypattern =
runRedis conn $ do
response <- keys keypattern
case response of
[BSC.ByteString] allkeys ->
case length allkeys of
Just (n, _) -> return n
_ -> return 0
_ -> return 0

但是,这当然行不通。我已经尝试了上述的几十种变体。如何提取并返回此 res::IO 右侧的长度(要么回复 [Data.ByteString.Internal.ByteString])?

最佳答案

你很接近!关键是让你的模式匹配 response 匹配它的类型。由于 keys keypattern::IO (Either Reply [ByteString])response 的类型为 Either Reply [ByteString]

Either a b 有两个构造函数 - Left::a -> Either a bRight::b -> Either a b,这些是当我们使用 case 解构一个 Either a b 值时可以匹配的模式。

redisKeyCount :: Connection -> BSC.ByteString -> IO Int
redisKeyCount conn keypattern =
runRedis conn $ do
response <- keys keypattern
return $ case response of
Left _reply -> 0
Right allKeys -> length allKeys

关于Haskell 从 IO 中提取长度(回复 [Data.ByteString.Internal.ByteString]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34010291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com