2013-07-19 52 views
0

這是簡單和愚蠢的,我不能只看到。Haskell mongodb:將二進制值轉換回ByteString

如果一個新的類型定義:

newtype Binary 

Constructors 
Binary ByteString 

Instances: 
Eq Binary  
Ord Binary 
Read Binary 
Show Binary 
Typeable Binary 
Val Binary 

我如何解構的二進制值來獲得字節字符串回來?

如果我想將二進制數據保存到mongodb中,比如說一張jpg圖片,我可以從文件系統中讀取ByteString中的Val Binary類型。然後我將它插入到文檔中。

當我從數據庫中讀取數據並將其從文檔中取出時,我最終得到了Binary類型,並且我被它困住了。我無法獲得與ByteString.writeFile一起使用的ByteString類型。

所以跳過所有連接東西的流動是這樣的:

file <- B.readFile "pic.jpg" -- reading file 
let doc = ["file" =: (Binary file)] -- constructing a document to be inserted 
run $ insert_ "files" doc -- insert the document 
r <- run $ fetch (select [] "files") -- get Either Failure Document back from db 
let d = either (error . show) (id) r -- Get the Document out 
let f = at "file" d :: Binary -- Get the data out of the document of type Binary 

謝謝。

回答

4

假設你newtype看起來像這樣,

newtype Binary = Binary ByteString 

,那麼你可以簡單地在構造模式匹配來獲取ByteString回:

unBinary :: Binary -> ByteString 
unBinary (Binary s) = s 
+0

謝謝你,謝謝你,謝謝你!我知道這是愚蠢的))那麼,它是通過模式匹配去構造這種新類型的正常方式嗎? –

+1

你也可以newtype Binary = Binary {unBinary :: ByteString},它將爲你創建函數。這是我通常的做法。 –

+0

@mindreader謝謝。如果我自己創建新類型,我會做記錄,但新類型Binary在庫中定義。我認爲應該有一個函數來解構類似於記錄語法。但模式匹配的作品也一樣,我錯過了這一點是愚蠢的。 –

相關問題