Haskell 持久列表

Posted

技术标签:

【中文标题】Haskell 持久列表【英文标题】:Haskell persistent list 【发布时间】:2013-03-14 17:26:03 【问题描述】:

我是 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

所以我可以从其他函数递归调用它来填满书架。我不相信这对我有用,因为我试图通过 JSON PUT 请求添加记录,并且我不想返回更新的列表以供外部 HTTP 客户端递归调用的函数?我敢肯定,这个问题一定有一个简单的答案!

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

【问题讨论】:

【参考方案1】:

您需要以某种方式对状态进行建模。既然你是新手,让我们采用一种简单的方法:向你的服务器添加一个参数来跟踪状态:

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

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

这个函数永远不会返回,也永远不会对书架做任何事情,所以它本身没有用,但你明白了吗?

【讨论】:

谢谢。我想我明白了。但是如果我使用 Scotty 模块来服务 POST/GET 请求(见上文),我的服务器因此在 Haskell 中 - 所以这仍然意味着我需要使用 Haskell 方法存储它? @AnthonyW,你是对的。我讨厌回调。您需要使用IORef 来存储状态。

以上是关于Haskell 持久列表的主要内容,如果未能解决你的问题,请参考以下文章

为啥haskell中的递归列表这么慢?

如何在 haskell 中打印列表?

在 Haskell 中交错列表列表

Haskell,树中的列表列表

如何展平haskell中的列表列表

列表中最短的列表(Haskell)