繁体   English   中英

Haskell案例陈述语法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM