'do'结构中的最后一个语句必须是表达式Haskell

时间:2012-04-07 21:07:14

标签: haskell

基于其他类似的问题,我发现我认为我的问题与缩进有关,但我已经搞砸了很多但仍然无法弄清楚。

addBook = do
    putStrLn "Enter the title of the Book"
    tit <- getLine
    putStrLn "Enter the author of "++tit
    aut <- getLine
    putStrLn "Enter the year "++tit++" was published"
    yr <- getLine

4 个答案:

答案 0 :(得分:18)

在你的情况下,它不是缩进;你真的用一些不是表达的东西完成了你的功能。 yr <- getLine - 在此之后,您对yr或者aut的期望是什么?他们只是悬空,没用。

更清楚地说明这是如何转换的:

addBook = putStrLn "Enter the title of the Book" >>
          getLine >>= \tit ->
          putStrLn "Enter the author of "++ tit >>
          getLine >>= \aut ->
          putStrLn "Enter the year "++tit++" was published" >>
          getLine >>= \yr ->

那么,你想在最后一支箭头之后得到什么?

答案 1 :(得分:7)

考虑addBook的类型。这是IO a,其中a是......什么都没有。这不起作用。你的monad必须有一些结果。

你可能想在最后添加这样的东西:

return (tit, aut, yr)

或者,如果您不想获得任何有用的结果,请返回一个空元组(单位):

return ()

答案 2 :(得分:1)

如果你拿走你的代码:

addBook = do
    putStrLn "Enter the title of the Book"
    tit <- getLine
    putStrLn "Enter the author of "++tit
    aut <- getLine
    putStrLn "Enter the year "++tit++" was published"
    yr <- getLine

和&#34;翻译&#34;它正常&#34;正常&#34; (非do)表示法(给定p = putStrLn "..."):

addBook = 
    p >> getLine >>= (\tit ->
        p >> getLine >>= (\aut ->
            p >> getLine >>= (yr ->

你最终得到的(yr ->没有任何意义。如果你没有其他任何有用的东西,你可以返回一个空元组:

return ()

最后:

addBook = do
    putStrLn "Enter the title of the Book"
    tit <- getLine
    putStrLn "Enter the author of "++tit
    aut <- getLine
    putStrLn "Enter the year "++tit++" was published"
    yr <- getLine
    return ()

您应该问问自己为什么需要获得autyr

答案 3 :(得分:0)

删除最后一行,因为它不是表达式, 然后对传递给putStrLn的字符串使用括号。