2015-01-14 13 views
26

私は大学のためにハスケルを習得しなければなりません。そのために、私はlearnyouahaskell.comを最初に使っています。
私はいつも命令言語を使いましたので、他の言語よりもはるかに多くをコーディングすることによってHaskellを練習することに決めました。
は、私はそのようなheadtailinitとして、私は私と比較し、これらの機能の実装を見上げ、いくつかの時点で
リストを操作するには、いくつかの機能を実装するために始めたと私はList.lhsで定義されたヌル機能つまずい。ヌル関数の実装

ヌルの実装:

-- | Test whether a list is empty. 
null     :: [a] -> Bool 
null []     = True 
null (_:_)    = False 

私の実装:私も、このような簡単な質問:)
には愚かな質問があるので、私の質問は、なぜ元の実装が使用されません知っている

mNull :: [a] -> Bool 
mNull []  = True 
mNull _   = False 

_の代わりに(_:_)
(_:_)を使用する利点はありますか、わからないようなエッジケースはありますか?
_はすべてをキャッチするので、私は実際に何か利点を想像することはできません。

+4

これは本当に平等ですが、私はそれも愚かであることがわかります。私の推測では、著者は明示的になりたいと思っています。 – MasterMastic

答えて

39

あなたは自分の溶液で周りの句をオンにすることはできません空のリストを渡します。実行時には[]句が考慮されていないため、すぐに_がすべて一致するとみなされます。 (GHCは、このような重複パターンについての警告が表示されます。)一方

、まだ正しく動作

null' :: [a] -> Bool 
null' (_:_) = False 
null' [] = True 

(_:_)は空のリストの特定のケースと一致しないので。

それ自体では、2つの明示的な節に実際には利点がありません。しかし、より複雑なコードでは、excluseのすべてのオプションを書き出すことには1つの利点があります.1つのオプションを忘れてしまった場合、コンパイラはそのことについて警告することもできます。 _は、それが実際には正しくない場合でも、前の節で扱われていないすべてのケースを処理できます。

+0

誰かがこの投稿がとてもばかげて人気がある理由を知っていますか? – leftaroundabout

6

_は、文字通り明示的に指定されたパターンを除いて何かを意味します。 (_:_)を指定すると、少なくとも1つの要素を含むリストとして表現できるものを意味し、リストに実際に何が含まれているのか、いくつの要素が含まれていても構いません。空リストのパターンが明示的に存在するケースが既に存在するので、(_:_)_に置き換えられる可能性があります。

しかし、それを(_:_)として表すと、空のリストパターンを明示的に渡すことさえできない柔軟性が得られます。実際には、これは動作します:

mNull' :: [a] -> Bool 
mNull' _ = False 
mNull' [] = True 

この 意志常に歩留まりFalse、たとえ:

-- | Test whether a list is empty. 
null     :: [a] -> Bool  
null (_:_)    = False 
null _     = True 

Demo

4

私はleftaroundaboutと言いました。これは本当にリスト型の潜在的な問題ではありませんが、一般的にはデータ型が変更されることがあります。あなたは悪い考え

data FavoriteFood = Pizza 
        | SesameSpinachPancake 
        | ChanaMasala 

以降をお持ちの場合は、DrunkenNoodlesが好きで、リストに追加し、種類のパターンマッチを拡大する必要がありますすべての機能を学びます。 _パターンを使用した場合は、パターンを手動で検索する必要があります。コンパイラはあなたを助けることはできません。それぞれのことを明示的に一致させると、-fwarn-incomplete-patternsをオンにすることができます.GHCはあなたが見逃したすべてのスポットについて教えてくれます。