基于其他类似的问题,我发现我认为我的问题与缩进有关,但我已经搞砸了很多但仍然无法弄清楚。
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
答案 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 ()
您应该问问自己为什么需要获得aut
和yr
。
答案 3 :(得分:0)
删除最后一行,因为它不是表达式, 然后对传递给putStrLn的字符串使用括号。