我无法在case
块中找出do
表达式的语法问题。
正确的语法是什么?
如果你能纠正我的例子并解释它是最好的。
module Main where
main = do
putStrLn "This is a test"
s <- foo
putStrLn s
foo = do
args <- getArgs
return case args of
[] -> "No Args"
[s]-> "Some Args"
稍微更新一下。我的源文件是空格和制表符的混合,它引起了各种各样的问题。 对于从Haskell开始的任何其他人来说,只是一个提示。如果您遇到问题,请检查源代码中的标签和空格。
答案 0 :(得分:28)
return是一个(重载)函数,它并不期望它的第一个参数是关键字。您可以使用括号:
module Main where
import System(getArgs)
main = do
putStrLn "This is a test"
s <- foo
putStrLn s
foo = do
args <- getArgs
return (case args of
[] -> "No Args"
[s]-> "Some Args")
或使用方便的应用程序运算符($):
foo = do
args <- getArgs
return $ case args of
[] -> "No Args"
[s]-> "Some Args"
Stylewise,我将其分解为另一个函数:
foo = do
args <- getArgs
return (has_args args)
has_args [] = "No Args"
has_args _ = "Some Args"
但你仍需要括号或使用($),因为return接受一个参数,而函数应用程序是最高优先级。
答案 1 :(得分:11)
等效地:
foo = do
args <- getArgs
case args of
[] -> return "No Args"
[s]-> return "Some Args"
这可能比wnoise建议更好,但这可能有助于人们更好地理解。