【发布时间】:2019-01-12 14:04:08
【问题描述】:
我试图重写那个程序,它正在工作:
nameIOite :: IO ()
nameIOite = do
putStrLn "What's your name ?"
name <- getLine
if name `elem` ["Simon","John","Phil"]
--if name == "Simon" || name == "John" || name == "Phil" also works but is ugly.
then putStrLn "I think Haskell is a great programming language."
else if name == "Koen"
then putStrLn "I think debugging Haskell is fun."
else putStrLn "I don't know your name."
这是使用 if/then/else 完成的(因此是nameIOite 中的后缀ite)
然后我尝试使用警卫:
nameIOg :: IO ()
nameIOg = do
putStrLn "What's your name ?"
name <- getLine
let answer
| name `elem` ["Simon","John","Phil"] = "I think Haskell is a great programming language."
| name == "Koen" = "I think debugging Haskell is fun."
| otherwise = "I don't know your name."
putStrLn answer
这不起作用:
test.hs:6:9: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
6 | | name `elem` ["Simon","John","Phil"] = "I think Haskell is a great programming language."
| ^
Failed, no modules loaded.
经过一些实验,结果证明解决方案再次缩进警卫(我根本不清楚):
nameIOg :: IO ()
nameIOg = do
putStrLn "What's your name ?"
name <- getLine
let answer
| name `elem` ["Simon","John","Phil"] = "I think Haskell is a great programming language."
| name == "Koen" = "I think debugging Haskell is fun."
| otherwise = "I don't know your name."
putStrLn answer
Ok, one module loaded.
双缩进是从哪里来的,有没有办法写得更优雅?
(顺便说一句,我在查看我的 wikibook.hs 文件时偶然发现了这一点。)
示例来源:there
解决方案:there
【问题讨论】:
-
还要注意,额外的缩进可以是一个空格——只要
|s 在a的右边至少有一个字符,这应该可以工作。
标签: haskell io guard-statement