2010-12-19 6 views
4
head' :: [a] -> a 
head' [] = error "No head for empty lists!" 
head' (x:_) = x 

head' :: [a] -> a 
head' xs = case xs of [] -> error "No head for empty lists!" 
         (x:_) -> x 

私はわかりませんがかなり簡単な質問をしています。 上記のコードでは、入力用のリストが必要です。 しかし、3行目には、私を混乱させる(x:_)と書かれています。 [x:_]ではなく、(x:_)と書かれた理由は誰でも説明できますか?(x:_)と[x:_]はどういう意味ですか?

さらに、(x:_)の意味を理解できません。

ありがとうございます。

+2

'(x:_)'は '[a]'、 '[x:_]'は '[[a]]'型です。 – delnan

答えて

5

これはpattern matchingという概念です。 :はインフィックスのコンストラクタです。ちょうど+がインフィクス関数です。 Haskellでは、コンストラクタとパターンが一致します。

(1 : 2 : 3 : []) 

は、角括弧表記はリストを作成するためだけの構文糖である、[1, 2, 3]と同じです。

パターン(x : _)は、リストの最初の要素をxにバインドし、残りの部分については気にしないことを意味します。_

+0

アダムスに感謝します。私はまた、合成糖が何を意味するのだろうかと思います。英語は私の最初の言葉ではありません。 – tpark

+2

http://en.wikipedia.org/wiki/Syntactic_sugar – bruno

14

:は、新しいリストの先頭を左の引数として、テールを右の引数として取るリストのコンストラクタです。ここでのようなパターンとして使用すると、一致するリストの先頭が左のパターンに与えられ、右のテールが右に与えられます。

この場合、リストの先頭は変数xに格納され、テールは使用されません(_は値を気にしないことを意味します)。

はい、[]を使用してリストに対してパターンマッチングを行うことはできますが、固定サイズのリストのみを使用することができます。たとえば、パターン[x]は、正確に1つの要素を持つリストと一致し、変数xに格納されます。同様に[x,y]は、2つの要素を持つリストと一致します。

あなたの提案したパターン[x:y]は、パターンx:yに一致する1つの要素でリストを照合します。言い換えれば、正確に1つのリストを含むリストのリストと一致する。

+0

コメントありがとうございます。私はあなたがハックの初心者のためにお勧めのお勧めの本やサイトがあるのだろうか? – tpark

+2

あなたのためのGoogle haskellを学ぼう。 – fuz

+0

@tpark:このサイトには、Haskellの学習に関する多くのアドバイスが含まれています。それは1週間おきにポップアップする質問のようです。これらの2つの質問はいくつかの有益な答えを提供します:["How to Learn Haskell"](http://stackoverflow.com/questions/1012573/how-to-learn-haskell)と["Haskell初心者ガイド"](http: /stackoverflow.com/questions/16918/beginners-guide-to-haskell)。この検索はより有用なリソースを提供するかもしれません:["learn haskell"](http://stackoverflow.com/search?q=learn+haskell)。私は[Learn You a Haskell](http://learnyouahaskell.com/)を楽しんだ。 – adamse

関連する問題