2013-03-14 58 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