我试图用Haskell驱动程序向Riak介绍自己,并且我遇到了一个简单的put
操作.我对put
功能的签名感到困惑.那里的任何地方都没有一个例子.
所以有这个签名:
put :: (FromJSON c, ToJSON c, Resolvable c) => Connection -> Bucket
-> Key -> Maybe VClock -> c -> W -> DW -> IO (c, VClock)
Run Code Online (Sandbox Code Playgroud)
我有一些问题.
什么是Maybe VClock?我是否必须以某种方式生成它或者只是在那里指定Nothing就足够了?为什么我在返回的元组中得到这个VClock?
我是否必须为每个简单的值编写FromJSON和ToJSON实例,即使它是一个简单的字符串值?就像我想用"名称"键来设置值"Stitch"一样,我该怎么做?
什么是Resolvable
实例?如何使Text或String值可解析?我知道我必须定义resolve
函数,但我不太了解它的含义以及如何做到这一点.
我希望以下简单的 put 和 get 操作代码可以帮助您:
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE UndecidableInstances #-}
module Main where
import Data.Aeson
import qualified Network.Riak as Riak
import Network.Riak.Types
import Data.ByteString.Char8 hiding (putStrLn)
import Data.ByteString.Lazy as L hiding (pack,putStrLn)
import GHC.Generics hiding (R)
-- convert String to lazy ByteString
toBS :: String -> L.ByteString
toBS str = L.fromChunks (pack (str):[])
putBucket :: Bucket
putBucket = toBS "Bucket"
putKey :: Key
putKey = toBS "key"
r :: R
r = Default
w :: W
w = Default
dw :: DW
dw = Default
rw :: RW
rw = Default
-- declare a data and create its instances
data Coord = Coord { x :: Double, y :: Double } deriving (Generic, Show)
instance FromJSON Coord
instance ToJSON Coord
instance (Show Coord) => Riak.Resolvable Coord where
resolve a b = a
value :: Coord
value = Coord {
x = 2.2,
y = 3.3
}
main :: IO ()
main = do
-- establish a connection
let client = Riak.defaultClient
con <- Riak.connect client
-- simple put operation
put_ret <- (Riak.put con putBucket putKey Nothing value w dw)
putStrLn (show put_ret)
buckets <- Riak.listBuckets con
print buckets
-- simple get operation
get_ret <- (Riak.get con putBucket putKey r) :: IO ( Maybe (Coord, VClock))
putStrLn (show get_ret)
-- delete a value
Riak.delete con putBucket putKey rw
-- if try to get that value we will find "Nothing"
get_ret <- (Riak.get con putBucket putKey r) :: IO ( Maybe (Coord, VClock))
putStrLn (show get_ret)
-- print the final bucket list
buckets <- Riak.listBuckets con
print buckets
Run Code Online (Sandbox Code Playgroud)