在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"
最好按照噪声提示进行操作,但这可以帮助某人更好地理解。