Haskell解析输入"<-"的错误 也许这个语句应该在'do'块内?



我正在学习Haskell,并且很难使用这个非常简单的程序:

chooseDifficulty :: IO ()
chooseDifficulty =
do putStrLn "Choose your difficulty:"
putStrLn "  1: easy"
putStrLn "  2: medium"
putStrLn "  3: difficult"
let choice <- getLine
putStrLn "Choice was " ++ choice
main :: IO ()
main = chooseDifficulty

我犯了一个错误";分析输入"<-"时出错也许这个语句应该在"do"块内"在第7行。我尝试过各种格式,但由于它已经在do块中,所以一直无法修复。

Haskell的do语法具有以下特性:

1

do
...
action   -- e.g. putStrLn "bla"
moreStuff

只需执行操作(即将其绑定到monad中(,丢弃任何结果,并且不引入新的变量。在引擎盖下,它使用>>运算符对action进行排序,然后对action >> moreStuff进行排序。

2

do
...
let v = 37
moreStuff

这与一元操作没有任何关系,只是编写标准let:的方式略有不同

do
...
let v = 37 in moreStuff

do
...
let v = 37
in do
moreStuff

请注意,这只适用于像数字这样的"纯值";写let v = getLine之类的东西是没有用的,因为这实际上不会调用操作,只会给它一个新名称

3

do
...
y <- resultfulAction   -- e.g. getLine
moreStuff

这个没有let。这将执行该操作,并将其结果绑定到变量y中。在引擎盖下,它使用>>=运算符,即resultfulAction >>= y -> moreStuff

最新更新