2

Haskellを使い始めたばかりで、問題に遭遇しました。Haskellによると、パターンマッチに失敗しましたが、その方法がわかりません。これは私が実行しようとしているコードです:

statistics ::   [Int] -> (Int, Int, Int)
statistics [gradelist] = ( amountParticipants, average, amountInsufficient)
                        where
                            amountParticipants= length [gradelist]
                            average= sum[gradelist] `div` amountParticipants
                            amountInsufficient= length [number| number<- [gradelist], number<6]

私は「統計」を次のように呼びます。

statistics[4,6,4,6]

これにより、パターンマッチが失敗しますが、次のようになります:(4、5、2)

statistics[6]

答えを与える:(1、6、0)(これは正しいです)。誰かが私の最初の呼び出しがこのパターンマッチを引き起こす理由を教えてもらえますか?私は引数としてリストを与えるとかなり確信しているので

4

3 に答える 3

7

あなたが書くなら、あなたはと呼ばれる唯一の要素を含むシングルトンstatistics [gradelist] = ...リストに対してパターンマッチングをしている。したがって、関数は正確に1の長さのリスト(など)に対してのみ定義されます。空のリスト()または2つ以上の要素を持つリスト(など)では未定義です。gradelist[6][][4,6,4,6]

関数の正しいバージョンは次のようになります

statistics :: [Int]     -> (Int, Int, Int)
statistics    gradelist =  (amountParticipants, average, amountInsufficient)
  where
    amountParticipants = length gradelist
    average            = sum gradelist `div` amountParticipants
    amountInsufficient = length [number| number <- gradelist, number < 6]

gradelist@thoferonが述べたように、を計算するときにゼロ除算を回避するために、空の場合にも特別な調整を行う必要がありますaverage

于 2013-03-26T13:54:23.310 に答える
2

前に述べたようにあなた[gradelist]のを置き換えるだけです。gradelistまた、次のように、ゼロによる除算を回避するために、[]を使用して空のリストと照合することもできますaverage

statistics [] = (0,0,0)
于 2013-03-26T14:00:03.303 に答える
1

パターン内のリスト構文[ ]は、リストを分解します。パターン[gradelist]は、1つの値を保持するリストと一致し、リスト内の値に名前を付けますgradelist。4つの値を保持するリストを使用して関数を呼び出そうとすると、パターン一致が失敗します。

値を分解せずに一致させるには、パターンとして変数を使用します。

于 2013-03-26T13:56:36.867 に答える