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值,并创建一个新列表,其中包含新Item值和all_Items. 它不修改 all_Items.

但这不是错误消息的内容。

该行位于执行 i/o 的 do-block 中。每个语句必须是类型表达式IO something(可能将值绑定something到变量)或 let 语句。

而这条线

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

是类型的表达式[Item]。但是 anIO something是意料之中的,因此出现了错误。

如何修复这些错误:将 do-block 的最后两行替换为

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

另请注意

  • 你有

    all_Items = []
    

    addBook all_Items = do
    

    在第一种情况下all_Items是顶级值。在第二种情况下,它是addBook函数的参数。它们是不同的东西。

  • 你已经告诉 HaskellBook构造函数的第四个参数是一个Int. 你不需要重复自己。所以最后一行addBook可以是

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