【发布时间】:2012-03-05 20:19:55
【问题描述】:
抱歉标题不佳,请随时编辑。我不明白问题是什么,所以它可能是完全错误的。下面是代码(这是在我完成了一百个排列和不同的 let-do-if 和制表序列之后,我已经筋疲力尽了):
-- The last statement in a 'do' construct must be an expression
numberOfGoods :: IO String
numberOfGoods = do putStrLn "Enter year (2000-2012):\n"
let intYear = readYear
in if (intYear < 2000 || intYear > 2012)
then error "Year must be withing range: 2000-2012"
else
c <- readIORef connection
[Only i] <- query_ c ("select count('*')" ++
"from table" ++
"where ((acquisition_date <= " ++
(formatDate intYear) ++
") and ((sale_date is null) or " ++
"(sale_date < " ++
(formatDate intYear) ++ ")))")
return i
readYear :: Integer
readYear = do
year <- getLine
read year :: Integer
本来就是这么简单的东西……我还是不明白上面的代码有什么问题。请,如果您能解释错误的来源,那就太好了。 我确实阅读过关于 do、let-in 和 if-then-else 的内容,并且从手册中可以理解的内容来看,这里没有任何错误。
理想情况下,如果有替代品,我非常希望减少左侧浪费的空白数量。
谢谢。
【问题讨论】:
-
使用 IO 定义,
readYear不可能是整数。
标签: haskell syntax indentation