Haskell IO can't get the list to loop around a menu function

haskell, io

Solution

At the moment your type signature for `menu` doesn't make any sense. Do you mean something like this?

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

If so, then you could define it to be

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

This reads a string from the user, and then either adds a new book, displays the current list of books or ends the loop, returning the list of books.

Edit: The `>>` operator sequences two operations together. The combination `a >> b` means "do `a`, then do `b`".

The following two pieces of code are exactly equivalent (in fact, the first one is just syntactic sugar for the second)

do displayAllBooksFromYear books
   menu books

and

displayAllBooksFromYear books >> menu books

Hope that helps clear things up.

Problem

I'm currently making a text based menu system in haskell. I have made a data type called Book where each function edits the list and returns it. However I cannot work out how to make a menu part work where it can edit this list and recurse back around. Example on what I'm stuck on menu works, add a book to the list, menu then needs to reload the menu so I can display the books with the new addition. example of menu ``` menu:: [Book] -> [IO] menu books = do str <- getLine let selectNum = (read str :: Int) case selectNum of 1 -> let sd = addNewBookIO books 2 -> displayAllBooksFromYear books ``` example of adding a new book ``` 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 ``` Any help would be grateful

Original source