【问题标题】:Haskell syntax for a case expression in a do blockdo 块中 case 表达式的 Haskell 语法
【发布时间】:2008-10-01 02:36:51
【问题描述】:

对于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 开始的任何其他人的小费。如果您遇到问题,请检查源代码中的制表符和空格。

【问题讨论】:

    标签: haskell syntax monads


    【解决方案1】:

    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"
    

    在风格上,我会把它分解成另一个函数:

    foo = do
        args <- getArgs 
        return (has_args args)
    
    has_args [] = "No Args"
    has_args _  = "Some Args"
    

    但是你还是需要括号或者使用($),因为return接受一个参数,函数应用是最高优先级。

    【讨论】:

      【解决方案2】:

      等价:

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

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

      【讨论】:

      • 这个方法很好地强调了 IO 动作的一流特性。
      猜你喜欢
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2018-04-04
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多