【问题标题】:Haskell syntax for a case expression in a do blockdo 块中 case 表达式的 Haskell 语法
【发布时间】:2008-10-01 02:36:51
【问题描述】:
对于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 开始的任何其他人的小费。如果您遇到问题,请检查源代码中的制表符和空格。
【问题讨论】:
标签:
haskell
syntax
monads
【解决方案1】:
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接受一个参数,函数应用是最高优先级。
【解决方案2】:
等价:
foo = do
args <- getArgs
case args of
[] -> return "No Args"
[s]-> return "Some Args"
按照 wnoise 的建议进行操作可能更可取,但这可能有助于人们更好地理解。