2013-03-14 75 views
3

我是Haskell的新手,想知道是否有創建數據結構的簡單方法,我可以通過連續的函數調用添加記錄,並且不會丟失函數調用之間的結構狀態(持久性? ),而不需要數據庫。所以,我有:Haskell持久列表

data Book = Book { title :: String 
        , author :: String 
        , ISBN :: String 
        } 
        deriving (Eq, Show) 

type BookShelf = [Book] 

我明白,Haskell的方式這樣做是複製的數據結構,每當一個試圖做這樣的事返回的更新。所以這會像這樣:

addToBookShelf :: Book -> BookShelf -> BookShelf 
addToBookShelf b bs = b : bs 

所以我可以從一些其他函數遞歸調用來填充BookShelf。我不相信這會對我有用,因爲我試圖通過JSON PUT請求添加記錄,並且我不想爲外部HTTP客戶端遞歸調用的函數返回更新列表。我相信這肯定有一個簡單的答案!

附加信息:我正在使用Web.Scotty來解析JSON POST/GET。

回答

2

您需要以某種方式建模該狀態。既然你是新的,讓我們去一個簡單的方法:添加一個參數到你的服務器,用於跟蹤的狀態:

getBookViaJSON :: IO Book 
-- listen, convert, ... 

server :: BookShelf -> IO() 
server bookshelf = do 
    book <- getBookViaJSON 
    server (book:bookshelf) 

這個函數永遠不會返回,從來沒有做任何事情與書架,所以它不是有用的自己的權利,但你明白了嗎?

+0

謝謝。我想我明白了。但是,如果我使用Scotty模塊來爲POST/GET請求提供服務(請參閱上文),那麼我的服務器就在Haskell中 - 所以它仍然意味着我需要將它存儲到一些如何使用Haskell方法? – 2013-03-14 19:15:39

+3

@AnthonyW,呃你是對的。我討厭回調。您需要使用['IORef'](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-IORef.html)來存儲狀態。 – luqui 2013-03-14 19:18:42