0

私は自分で定義したこのタイプを持っています:

data Item =
Book String String String Int     -- Title, Author, Year, Qty
| Movie String String String Int  -- Title, Director, Year, Qty
    | CD String String String Int deriving Show  -- Title, Artist, Year, Qty

空のリストを作成しました

all_Items = []

次の関数を使用して、Item(Book)タイプの新しい本をall_Itemsに挿入しようとしています。

addBook all_Items = do
    putStrLn "Enter the title of the book"
    tit <- getLine
    putStrLn "Enter the author of the book"
    aut <- getLine
    putStrLn "Enter the year this book was published"
    yr <- getLine
    putStrLn "Enter quantity of copies for this item in the inventory"
    qty <- getLine
    Book tit aut yr (read qty::Int):all_Items
    return(all_Items)

ただし、次のエラーが発生します。

Couldn't match expected type `IO a0' with actual type `[a1]'

エラーは、consing演算子を使用して新しい本をリストに追加している行を示しています。タイプエラーであることがわかりますが、何が間違っているのか、どのように修正すればよいのかわかりません。前もって感謝します!

4

1 に答える 1

3

この行

    Book tit aut yr (read qty::Int):all_Items

は、既存の listall_Itemsと新しいItem値を受け取り、新しい値と 内のすべての項目で構成される新しいリストを作成します。変更しませんItemall_Items all_Items

しかし、それはエラー メッセージの内容ではありません。

行は i/o を行う do ブロックにあります。各ステートメントは、型の式IO something(値を変数にバインドする可能性がsomethingあります)、または let ステートメントのいずれかでなければなりません。

一方、この行

    Book tit aut yr (read qty::Int):all_Items

型の式[Item]です。しかし、IO somethingが予期されていたため、エラーが発生しました。

これらのエラーを修正する方法: do ブロックの最後の 2 行を次のように置き換えます。

    return (Book tit aut yr (read qty::Int):all_Items)

また、注意してください

  • あなたが持っている

    all_Items = []
    

    addBook all_Items = do
    

    最初のケースall_Itemsは最上位の値です。2 番目のケースでは、addBook関数のパラメーターです。それらは異なるものです。

  • Haskell には、Bookコンストラクターの 4 番目の引数がInt. 繰り返す必要はありません。したがって、の最後の行は次のaddBookようになります

        return (Book tit aut yr (read qty) : all_Items)
    
于 2012-04-07T23:25:04.957 に答える