我正在学习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
。