從Database.Redis我用runRedis康恩$ GET 「你好」,這是
runRedis conn $ get "hello"
:: IO (Either Reply (Maybe Data.ByteString.Internal.ByteString))
其中
conn <- connect defaultConnectInfo
但我想將輸出轉換爲String/ByteString,因爲我想將它與其他字符串進行比較。
我該怎麼做?
從Database.Redis我用runRedis康恩$ GET 「你好」,這是
runRedis conn $ get "hello"
:: IO (Either Reply (Maybe Data.ByteString.Internal.ByteString))
其中
conn <- connect defaultConnectInfo
但我想將輸出轉換爲String/ByteString,因爲我想將它與其他字符串進行比較。
我該怎麼做?
當你不確定Haskell的工作方式是找到他們的文檔(Hedis is here)時,一個很好的開始。您應該查看您需要的構建塊(即函數)及其定義。無論如何,在你的問題。
它看起來像你最終想要的東西,總是會返回ByteString
,所以讓我們從你的位置前進。
基本上,您正在使用以下功能:runRedis
和get
。簽名如下所示:
runRedis :: Connection -> Redis a -> IO a
get :: RedisCtx m f => ByteString -> m (f (Maybe ByteString))
這看起來有點混亂在第一。我知道runRedis
正在要求我給它一個基於Redis
的例程,而get
需要某種RedisCtx
(在那裏我會得到那個?)。好吧,如果你遍歷下來的兔子洞,然後看看定義爲Redis a
,你會看到,就是支持RedisCtx
已經:
RedisCtx Redis (Either Reply)
你應該注意到的第一件事是,Redis
單子已經爲您綁定m
和f
的RedisCtx
。具體而言,它將m
至Redis
和f
結合至Either Reply
。你還應該注意到Either
只是部分應用,這就是爲你提供了靈活性來指定成功時的返回類型(即Right
)。
這使得我們的生活變得更加簡單(您知道,paradox of choice and all that),因爲我們對於許多參數已經有了嚴格的類型。現在我們爲什麼要經歷這個練習?配備這種理解,我們現在可以看到如何使用get
方法!
由於我們申請從Redis
單子中獲得,我們知道它有一個約束RedisCtx
,我們知道那些m
和f
值是什麼。因此,我們得出一個剛性類型get
在我們當前使用情況:
get :: RedisCtx Redis (Either Reply) => ByteString => Redis (Either Reply (Maybe ByteString))
嗯,看起來更加明確,但也許不完全是用戶友好。省略Redis
單子(因爲我們要處理在它的輸出),您現在能想到的如何簡單處理:
Either Reply (Maybe ByteString)
現在看起來遠遠不那麼可怕,因爲一些非常第一你在Haskell中學到的東西是如何操作Either
和Maybe
類型。假設我們想省略的Either
(讀:你應該閱讀文檔,看看如何處理Reply
的情況下),在故障情況下,所有的突然我們的處理代碼似乎很簡單:
value <- get "..."
case value of
Left _ -> return "Some error occurred"
Right v -> return $ fromMaybe "Could not find key in store" v
TL;博士你可能尋找的是這樣的:
{-# 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
你見過HEDIS DOC [回覆](https://hackage.haskell.org/package/hedis-0.7.10/docs/Database-Redis的.html#T:回覆)?你將不得不妥善處理案件。你的問題是關於hedis還是如何處理這種包裝類型? – RageD