Haskell IO 无法让列表围绕菜单功能循环

标签 haskell io

我目前正在用 haskell 制作一个基于文本的菜单系统。我创建了一个名为 Book 的数据类型,其中每个函数都会编辑列表并返回它。但是,我无法弄清楚如何使菜单部分可以编辑此列表并递归回来。

关于我所坚持的例子 菜单有效, 将一本书添加到列表中, 然后,菜单需要重新加载菜单,以便我可以显示添加了新内容的书籍。

菜单示例

menu:: [Book] -> [IO]
menu books = do
  str <- getLine
  let selectNum = (read str :: Int)
  case selectNum of
     1 -> let sd = addNewBookIO books 
     2 -> displayAllBooksFromYear books

添加新书的示例

addNewBookIO :: [Book] -> IO [Book]
addNewBookIO films =
  do putStr "Film name: " 
     filmTitle <- getLine
     putStr "List all cahr in the Book (separated by commas): "
     cast <- addToStringArray []
     putStr "Year of Realese in the UK: "
     year <- getLine
     let test = (read year :: Int)
     putStr "List all the fans(separated by commas): "
     fans <- addToStringArray [] 
     putStrLn "Your Book has been added"
     let bookList = addbookFilm (Film bookTitle cast test fans) films
     return bookList

如有任何帮助,我们将不胜感激

最佳答案

目前,您的 menu 类型签名没有任何意义。你的意思是这样吗?

menu :: [Book] -> IO [Book]

如果是这样,那么您可以将其定义为

menu books = do
  str <- getLine
  case read str of
    1 -> do books' <- addNewBookIO books             -- add a new book, then loop
            menu books'
    2 -> displayAllBooksFromYear books >> menu books -- display books, then loop
    3 -> return books                                -- quit

这会从用户那里读取一个字符串,然后添加一本新书,显示当前的书籍列表,或者结束循环,返回书籍列表。

编辑: >> 运算符将两个操作序列在一起。组合 a >> b 表示“执行 a,然后执行 b”。

下面的两段代码是完全等价的(事实上,第一段代码只是第二段代码的语法糖)

do displayAllBooksFromYear books
   menu books

displayAllBooksFromYear books >> menu books

希望有助于解决问题。

关于Haskell IO 无法让列表围绕菜单功能循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15658093/

相关文章:

generics - Clojure 相当于 Haskell 的 "Scrap Your Boilerplate"(SYB)

haskell - 使用 Parsec 按字符串正确分割

c++ - fopen 并与磁盘同步

什么都不做的 Haskell IO 方法

c# - UWP 写入 CSV 文件

Haskell:获取列表的内存地址

parsing - 在解析表达式的评估中将 [IO String] 转换为 IO String

haskell - 为什么 foldl' 使用大量具有复杂数据结构的 RAM?

ruby - 在Ruby IO中处理SystemCallErrors的正确方法是什么?

linux - 文件系统操作真的 "flushed"