[英]Haskell case statement grammar
如何理解以下代码中的case args of
?
main :: IO ()
main = do
args <- getArgs
case args of
[dir, mbytes] | [(bytes ,"")] <- reads mbytes
, bytes >= 1 -> findDuplicates dir bytes
(_) -> do
name <- getProgName
printf "Something went wrong - please use ./%s <dir> <bytes>\n" name
这个case
表达式中的守卫正在使用PatternGuards
扩展,它是Haskell 2010的一部分而不是Haskell 98.这个想法是,通过这个扩展,你的守卫可以进行自己的模式匹配,而不仅仅是评估Bool
表达式。
所以你的case
表达式有两种模式:
[dir, mbytes]
和通配符模式。 如果[dir, mbytes]
与args匹配,则模式匹配仍然可能不成功:其警卫需要应用。 它有两个警卫:
[(bytes ,"")] <- reads mbytes
这意味着调用reads mbytes
必须与[(bytes, "")]
和
bytes >= 1
这是一个普通的布尔表达式。
如果所有这些模式匹配和保护成功,那么case
的第一个子句就是使用的那个; 否则,我们将进入默认子句并打印错误消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.