3

我目前正在使用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

任何帮助将不胜感激

4

1 回答 1

6

目前你的类型签名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

希望这有助于澄清事情。

于 2013-03-27T11:59:41.180 回答