2017-05-11 8 views
1

case args ofを理解するにはどうすればいいですか?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

私はかなり合理的な質問だと思う: "はっきりと標準ハスケルに従っていないこのケースの表現で、一体何が起こっている?あなたが 'PatternGuards'について知っているなら、もちろんその答えは明らかですが、あなたがそれについて知りたくないのであれば、あなたは"ハァッ "よりも何を求めることができますか? – amalloy

+0

これは、質問のタイトルを「ガードの中で左矢印が意味するもの」のように説明的に編集すると、この構文が意味することを検索する人々にとってはより役に立ちます。 –

答えて

3

このcase式のガードは、ない、Haskellの2010の一部をPatternGuards拡張を利用することが、アイデアは、この拡張子を持つ、あなたの警備員が自分のパターンマッチングを行うことができるということです98ハスケルされていませんちょうどBoolの式を評価してください。

[dir, mbytes] 

とワイルドカードパターン:

だからあなたcase式は二つのパターンがあります。 [dir, mbytes]がargsと一致する場合、パターンマッチは成功しない可能性があります。ガードを適用する必要があります。普通のブール式であるreads mbytesを呼び出すと[(bytes, "")]と一致しなければならないことを意味

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

、および

bytes >= 1 

:これは、2つのガードを持っています。

これらのパターンマッチとガードがすべて成功した場合は、caseの最初の句が使用されます。さもなければ、私達はデフォルト節に落ち、エラーメッセージを表示する。