gpt4 book ai didi

haskell - 从 runRedis conn $ get "hello"获取字符串 - Haskell

转载 作者:IT王子 更新时间:2023-10-29 06:11:20 25 4
gpt4 key购买 nike

从 Database.Redis 我使用 runRedis conn $ get "hello",这是

runRedis conn $ get "hello"
:: IO (Either Reply (Maybe Data.ByteString.Internal.ByteString))

在哪里

conn <- connect defaultConnectInfo

但我想将输出转换为 String/ByteString,因为我想将它与其他一些 String 进行比较。

我该怎么做?

最佳答案

当您不确定 Haskell 的工作原理时,一个好的起点是找到他们的文档 ( Hedis is here )。您应该查看所需的构建 block (即函数)及其定义。无论如何,关于你的问题。

看起来您最终想要的是始终返回 ByteString 的东西,所以让我们从当前位置继续前进。

基本上,您使用的是以下函数:runRedisget。签名如下所示:

runRedis::Connection -> Redis a -> IO a

get::RedisCtx m f => ByteString -> m (f (Maybe ByteString))

乍一看,这看起来有点令人困惑。我知道 runRedis 要求我给它一个基于 Redis 的例程,而 get 需要某种 RedisCtx(我到底要从哪里得到它?)。好吧,如果你穿过兔子洞并查看 Redis a 的定义,你会发现它已经支持 RedisCtx:

RedisCtx Redis(任意回复)

首先你应该注意到 Redis monad 已经绑定(bind)了 RedisCtxmf为你。特别是,它将 m 绑定(bind)到 Redis 并将 f 绑定(bind)到 Either Reply。您还应该注意到 Either 仅部分应用,这使您可以灵活地指定成功时的返回类型(即 Right)。

这让我们的生活更轻松(你知道,paradox of choice and all that)因为我们已经为我们的许多参数设置了严格的类型。现在我们为什么要做这个练习?了解了这一点,我们现在就可以了解如何使用 get 方法了!

因为我们在 Redis monad 中应用 get,我们知道它有一个绑定(bind)的 RedisCtx 并且我们知道那些 mf 值是。因此,在我们当前的用例中,我们为 get 制定了一个严格的类型:

get::RedisCtx Redis (Either Reply) => ByteString => Redis (Either Reply (Maybe ByteString))

好吧,这看起来不那么模棱两可,但可能并不完全用户友好。省略 Redis monad(因为我们要在其中操作输出),您现在可以考虑如何简单地处理:

Either Reply (Maybe ByteString)

现在,这看起来远没有那么可怕了,因为您在 Haskell 中首先学到的一些东西是如何对 EitherMaybe 类型进行操作。假设我们想忽略 Either 的失败案例(阅读:你应该阅读文档并了解如何处理 Reply 的案例),突然间我们的处理代码看起来很简单:

value <- get "..."
case value of
Left _ -> return "Some error occurred"
Right v -> return $ fromMaybe "Could not find key in store" v

tl;dr 您可能正在寻找这样的东西:

{-# LANGUAGE OverloadedStrings #-}
module Main(main) where

import Data.ByteString
import Data.Maybe
import Database.Redis

onlyStringResult :: ByteString -> Redis ByteString
onlyStringResult key = do
value <- get key
case value of
Left _ -> return "Some error occurred"
Right v -> return $ fromMaybe "Could not find key in store" v

main :: IO ()
main = do
conn <- connect defaultConnectInfo
result <- runRedis conn (onlyStringResult "hello")
print result

关于haskell - 从 runRedis conn $ get "hello"获取字符串 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36664552/

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