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

