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

标签 haskell redis

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

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

哪里

conn <- connect defaultConnectInfo

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

我该怎么做?

最佳答案

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

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

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

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

get::RedisCtx m f => ByteString -> m (f (也许是 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 并且我们知道那些 m和 f 值是。因此,我们在当前用例中得到了 get 的严格类型:

get::RedisCtx Redis(任一回复)=> ByteString => Redis(任一回复(可能是 ByteString))

嗯,这看起来不太含糊,但可能不太用户友好。省略 Redis monad(因为我们将在其中操作输出),您现在可以考虑如何简单地处理:

任一回复(可能是 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/

相关文章:

redis - 在 redis 服务器端评估的 lua 脚本中,应该使用 key 而不是扫描吗?

redis - 重新启动后不会出现Coldfusion 2016 API Manager

Haskell - 尽管 foldl' 和严格的数据结构,内存使用量过多

multithreading - 我可以限制 Haskell 中每个函数/monad/线程的内存使用吗?

node.js - 如何使用 Heroku/RedisCloud/Node.js 远程检查数据

node.js - 在 node.js 中,如何使用 socket.io 和 express 设置 redis?具体使用 RedisStore()

node.js - 无法重新启动 redis-server.service : Unit redis-server. 找不到服务

algorithm - 找到除以haskell的阶乘的数字的最大幂

haskell - 为什么 Eq (GADT) 案例给我一个类型错误?

haskell - contramap 的目的是什么?