Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从runRedis conn$Get";获取字符串;你好哈斯克尔_Haskell_Redis - Fatal编程技术网

Haskell 从runRedis conn$Get";获取字符串;你好哈斯克尔

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返回的东西,所

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

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