2017-05-11 63 views
1

如何理解下面代碼中的case args of? 2010哈斯克爾的Haskell case語法

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 
+0

你到底在問什麼? – jkeuhlen

+0

我認爲這是一個非常合理的問題:「這個'case'表達式到底發生了什麼,顯然不符合標準的Haskell?」如果你知道'PatternGuards',那當然答案是顯而易見的,但是如果你不知道它,你能問什麼比「呃?」還要多。 – amalloy

+0

如果您將問題標題編輯爲更具描述性的內容,例如「左側箭頭意味着什麼?」 –

回答

3

在此case表達衛兵正在利用PatternGuards延伸,部分但不是哈斯克爾98的想法是,與此擴展,您的衛士可以做自己的模式匹配,而不是隻是評估Bool表達式。

所以你case表達有兩種模式:

[dir, mbytes] 

和通配符模式。如果[dir, mbytes]與args匹配,則模式匹配仍可能不成功:其警衛需要申請。它有兩個後衛:

[(bytes ,"")] <- reads mbytes 

這意味着調用reads mbytes必須[(bytes, "")]匹配,並且

bytes >= 1 

這是一個普通的布爾表達式。

如果所有這些模式匹配並且警衛成功,那麼case的第一個子句就是使用的那個;否則,我們將轉到默認子句並輸出錯誤消息。