2016-04-16 66 views
1

從Database.Redis我用runRedis康恩$ GET 「你好」,這是

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

其中

conn <- connect defaultConnectInfo 

但我想將輸出轉換爲String/ByteString,因爲我想將它與其他字符串進行比較。

我該怎麼做?

+2

你見過HEDIS DOC [回覆](https://hackage.haskell.org/package/hedis-0.7.10/docs/Database-Redis的.html#T:回覆)?你將不得不妥善處理案件。你的問題是關於hedis還是如何處理這種包裝類型? – RageD

回答

1

當你不確定Haskell的工作方式是找到他們的文檔(Hedis is here)時,一個很好的開始。您應該查看您需要的構建塊(即函數)及其定義。無論如何,在你的問題。

它看起來像你最終想要的東西,總是會返回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 (Either Reply)

你應該注意到的第一件事是,Redis單子已經爲您綁定mfRedisCtx。具體而言,它將mRedisf結合至Either Reply。你還應該注意到Either只是部分應用,這就是爲你提供了靈活性來指定成功時的返回類型(即Right)。

這使得我們的生活變得更加簡單(您知道,paradox of choice and all that),因爲我們對於許多參數已經有了嚴格的類型。現在我們爲什麼要經歷這個練習?配備這種理解,我們現在可以看到如何使用get方法!

由於我們申請從Redis單子中獲得,我們知道它有一個約束RedisCtx,我們知道那些mf值是什麼。因此,我們得出一個剛性類型get在我們當前使用情況:

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

嗯,看起來更加明確,但也許不完全是用戶友好。省略Redis單子(因爲我們要處理在它的輸出),您現在能想到的如何簡單處理:

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;博士你可能尋找的是這樣的:

{-# 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