26

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

4

2 回答 2

32

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

于 2008-10-01T02:51:27.407 回答
12

等效地:

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

按照 wnoise 的建议,这样做可能更可取,但这可能有助于某人更好地理解。

于 2008-10-01T06:31:34.070 回答