2008-10-01 122 views
20

我无法完全弄清楚do块中case表达式的语法问题。Haskell句法表达式在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中的其他人来说,这只是一个提示。如果您遇到问题,请检查源代码中的制表符和空格。

回答

25

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" 

但你仍然需要加括号或使用($),因为返回值只有一个参数,函数应用程序的优先级最高。

+0

我以为尝试了这两种选择。在发送问题之前。 傻我。 谢谢 – Ted 2008-10-01 17:02:07

10

等价的:

foo = do 
    args <- getArgs 
    case args of 
     [] -> return "No Args" 
     [s]-> return "Some Args" 

这可能是最好做的wnoise建议,但是这可能帮助别人理解好一点。

+0

这种方法很好地强调了IO动作的一流特性。 – wnoise 2008-10-01 09:37:13