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

これにより、ユーザーから文字列が読み取られ、新しい本を追加するか、現在の本のリストが表示されるか、ループが終了して本のリストが返されます。

編集:オペレーターは>>2つの操作を一緒にシーケンスします。この組み合わせa >> ba、「実行してから実行する」という意味bです。

次の2つのコードはまったく同じです(実際、最初のコードは2番目のコードの単なる構文糖衣です)

do displayAllBooksFromYear books
   menu books

displayAllBooksFromYear books >> menu books

それが物事を片付けるのに役立つことを願っています。

于 2013-03-27T11:59:41.180 に答える