do块中的case表达式的Haskell语法

Ted*_*Ted 23 syntax monads haskell

我无法用块中的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"
Run Code Online (Sandbox Code Playgroud)

一点点更新.我的源文件是空格和制表符的混合,它引起了各种各样的问题.对于从Haskell开始的任何其他人来说,只是一个提示.如果您遇到问题,请检查源代码中的选项卡和空格.

wno*_*ise 29

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")
Run Code Online (Sandbox Code Playgroud)

或使用方便的应用程序运算符($):

foo = do
    args <- getArgs 
    return $ case args of
                [] -> "No Args"
                [s]-> "Some Args"
Run Code Online (Sandbox Code Playgroud)

Stylewise,我将其分解为另一个函数:

foo = do
    args <- getArgs 
    return (has_args args)

has_args [] = "No Args"
has_args _  = "Some Args"
Run Code Online (Sandbox Code Playgroud)

但你仍然需要括号或使用($),因为return接受一个参数,而函数应用程序是最高优先级.


Pet*_*rns 11

等价的:

foo = do
  args <- getArgs 
  case args of
        [] -> return "No Args"
        [s]-> return "Some Args"
Run Code Online (Sandbox Code Playgroud)

这可能比wnoise建议的更好,但这可能有助于人们更好地理解.