在do块中使用case表达式的Haskell语法

29

do 代码块中,我无法解决一个 case 表达式的语法问题。

正确的语法是什么?

如果您能纠正我的示例并解释一下,那就太好了。

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 的人来说,一个小提示就是如果你在代码中遇到问题,请检查源代码中的制表符和空格。

2个回答

36

return是一个(重载)函数,它不希望第一个参数是关键字。你可以使用括号:

return(arg1,arg2)

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接受一个参数,而函数应用是最高优先级。


14

等价地:

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

按照wnoise的建议进行操作可能更好,但这可能有助于某些人更好地理解。


这个方法很好地强调了IO操作的一流性质。 - wnoise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接