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

时间:2020-03-06 14:57:32  来源:igfitidea点击:

我不太想在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开始的其他人的提示。如果遇到问题,请检查源代码中的制表符和空格。

解决方案

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需要一个参数,并且函数application是最高优先级。

等效地:

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

最好按照噪声提示进行操作,但这可以帮助某人更好地理解。