0

この関数の 1 番目と 3 番目のバージョンでこのエラーが発生するのに、2 番目の定義では問題なく動作する理由について、私は混乱しています。

-- head and tail
third :: [a] -> a
third [a] = head (tail (tail[a]))

-- Pattern matching
third2 :: [a] -> a
third2 (_:_:x:_) = x

-- List indexing
third3 :: [a] -> a
third3 [a] = [a]!!2

前もって感謝します

4

2 に答える 2

4

third2長さが 0、1、または 2 のリストには一致しないため、2 番目のパターンが非網羅的なパターンについて文句を言わないのは奇妙です。thirdand関数は、変数ではなくパターンであるため、third3不平を言います。に脱糖するので、次のように書くこともできます[a][a](a:[])

third (a:[]) = head (tail (a:[]))

third3 (a:[]) = (a:[]) !! 2

これらは単一の要素リストであるため、どちらも機能しません。私はあなたが何を望んでいると思います

third a = head (tail a)

third3 a = a !! 2
于 2013-02-15T15:11:48.140 に答える
1

構文をよく理解する必要があります。

基本的に、2 つのサブ構文があります。

  1. 型の構文
  2. 式とパターンの構文

型構文で[a]は、list of elements of type a

式/パターンの構文で[a]は、値を含むシングルトン リストを意味しますa。これは(a:[]) (空のリストの前に追加された) と同等です。

したがって、たとえば、最初の関数は、シングルトン リストを取得するかどうかを確認します。次に、シングルトン リストの先頭の末尾の末尾を取得しますが、これは失敗します。

あなたが得ているメッセージは、あなたがカバーしていないリストの形があるからです: つまり、空のリストと複数の要素を持つリストです。

third2そしてもちろん、 3 つ以上の要素を持つリストのみをカバーするため、警告が表示されるはずです。私はあなたが何かを見落としていると確信しています。

于 2013-02-15T15:13:38.027 に答える