[英]Haskell IF Else
input <- readLn
if (input == 0)
then
putStr "0"
else if (input ==1)
then
putStr "1"
else if (input ==2)
在这种情况下,如何在then
或else if
中使用多个 putStr?
当我尝试出错时
Type error in application
*** Expression : putStr "0" putStr "0"
*** Term : putStr
*** Type : String -> IO ()
*** Does not match : a -> b -> c -> d
使用do
表示法:
do
a <- something
if a
then
do
cmd1
cmd2
else
do
cmd3
cmd4
cmd5 -- this comes after the 'then' and the 'else'
对此的规范解释是,您想从两个现有的一元值中形成一个新的一元值。 我们来看看 putStr 的类型,
IO ()
这意味着它是一个黑匣子,在执行时将“返回”单元类型的(唯一的)值。 一元计算背后的关键思想是你有一个组合器>>=
它将组合两个一元表达式,将一个的结果输入下一个(更准确地说,一个创建下一个的 function)。 一个关键点是IO
库提供了这个组合器,这意味着,
IO
的情况下, RealWorld
state 包含打开的文件句柄等。在你的情况下,像这样使用它,
putStr "0" >>= (\c -> putStr "0")
当然有捷径
putStr "0" >> putStr "0"
还有 do-notation,正如另一张海报所提到的,它更像是语法糖,
do
putStr "0"
putStr "0"
对于这个人为的示例,您也可以使用一个案例,如下所示:
main = readLn >>= \input -> case input of
0 -> putStrLn "0"
1 -> putStrLn "0"
2 -> putStr "0"
>> putStrLn "0"
3 -> putStr "0"
>> putStr "0"
>> putStrLn "0"
_ -> putStrLn "infinite"
使用 do 语法可能更易于阅读,但我想先不使用 do 语法来展示它,只是为了强调 do-syntax 只是语法,实际上并没有做任何特别的事情。 这里是do-syntax。
main = do
input <- readLn
case input of
0 -> putStrLn "0"
1 -> putStrLn "0"
2 -> do putStr "0"
putStrLn "0"
3 -> do putStr "0"
putStr "0"
putStrLn "0"
_ -> putStrLn "infinite"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.