Haskell 从runRedis conn$Get";获取字符串;你好哈斯克尔
在Database.Redis中,我使用runRedis conn$get“hello”,这是Haskell 从runRedis conn$Get";获取字符串;你好哈斯克尔,haskell,redis,Haskell,Redis,在Database.Redis中,我使用runRedis conn$get“hello”,这是 runRedis conn $ get "hello" :: IO (Either Reply (Maybe Data.ByteString.Internal.ByteString)) 在哪里 conn当您不确定Haskell中的工作方式时,最好从查找他们的文档开始()。您应该查看所需的构建块(即函数)及其定义。不管怎样,请回答你的问题 看起来您最终想要的是始终通过testring返回的东西,所
runRedis conn $ get "hello"
:: IO (Either Reply (Maybe Data.ByteString.Internal.ByteString))
在哪里
conn当您不确定Haskell中的工作方式时,最好从查找他们的文档开始()。您应该查看所需的构建块(即函数)及其定义。不管怎样,请回答你的问题
看起来您最终想要的是始终通过testring返回的东西,所以让我们从现在开始
基本上,您正在使用以下函数:runRedis
和get
。签名如下:
runRedis::Connection->Redis a->IO a
get::RedisCtx mf=>ByteString->m(f(可能是ByteString))
一开始这看起来有点混乱。我知道runRedis
需要我给它一个基于Redis
的例程,get
需要某种RedisCtx
(我到底要从哪里得到它?)。好的,如果你穿过兔子洞,看看redisa
的定义,你会发现它已经支持RedisCtx
:
RedisCtx Redis(任一回复)
您应该注意的第一件事是Redis
monad已经为您绑定了RedisCtx的m
和f
。特别是,它将m
绑定到Redis
,将f
绑定到或Reply
。您还应该注意到,或
仅部分应用,这为您提供了在成功时指定返回类型的灵活性(即右侧
)
这使我们的生活更轻松(你知道,是的),因为我们已经有了许多参数的刚性类型。为什么我们要做这个练习?有了这种理解,我们现在可以看到如何使用get
方法了
由于我们在Redis
monad中应用get-from,我们知道它有一个界限RedisCtx
,我们知道那些m
和f
值是什么。因此,在我们当前的用例中,我们为get
提供了一种严格的类型:
get::RedisCtx Redis(任一回复)=>ByteString=>Redis(任一回复(可能是ByteString))
嗯,这看起来不那么模棱两可,但可能不完全是用户友好的。省略Redis
monad(因为我们要处理其中的输出),现在可以考虑如何简单地处理:
任一回复(可能是通过testring)
现在,这看起来不那么可怕了,因为你在Haskell中学到的第一件事就是如何操作或者或者或者类型。假设我们想省略的失败案例
(阅读:您应该阅读文档,看看如何处理回复的案例
),我们的处理代码突然变得简单起来:
value <- get "..."
case value of
Left _ -> return "Some error occurred"
Right v -> return $ fromMaybe "Could not find key in store" v
值返回“发生了一些错误”
右v->return$fromMaybe“无法在存储中找到密钥”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
{-#语言重载字符串}
主模块(Main),其中
导入数据.ByteString
导入数据,也许吧
导入数据库.Redis
onlyStringResult::ByteString->Redis ByteString
onlyStringResult key=do
返回值“发生了一些错误”
右v->return$fromMaybe“无法在存储中找到密钥”v
main::IO()
main=do
康妮,你见过海迪斯医生吗?你必须妥善处理它的案件。您的问题是关于hedis还是如何处理这种包装类型?
{-# 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