我目前正在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
任何帮助都会感激不尽
答案 0 :(得分: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
希望有助于澄清事情。