2017-04-30 14 views
0

ここでは何が欠けているのか分かりませんが、以下のコードでcheckDiffのパターンマッチングを行うことができませんでした。 GHCiの機能checkDiffのレポート「非網羅的なパターンのコードは次のとおりです。タプルのリストで非網羅的なパターンが一致する

import Data.Array.Unboxed 

primes :: [Int] 
primes = 2 : oddprimes() 
    where 
    oddprimes() = 3 : sieve (oddprimes()) 3 [] 
    sieve (p:ps) x fs = [i*2 + x | (i,True) <- assocs a] 
         ++ sieve ps (p*p) ((p,0) : 
          [(s, rem (y-q) s) | (s,y) <- fs]) 
    where 
     q = (p*p-x)`div`2 
     a :: UArray Int Bool 
     a = accumArray (\ b c -> False) True (1,q-1) 
        [(i,()) | (s,y) <- fs, i <- [y+s, y+s+s..q]] 

takePrimes :: [Int] -> [(Int,Int)] 
takePrimes [] = [] 
takePrimes [x] = [] 
takePrimes (x:y:zs) = if y - x > 2 then (x,y) : takePrimes (y:zs) else takePrimes (y:zs) 

checkDiff :: [(Int,Int)] -> Int 
checkDiff [] = 0 
checkDiff [(0,_)] = 0 
checkDiff [(_,0)] = 0 
checkDiff [(a,b)] = sum $ [x | x <- [(a + 1)..(b - 1)], totalFactors a == totalFactors (a + 1)] 

totalFactors :: Int -> Int 
totalFactors n = length $ [x | x <- [2..(div n 2)], rem n x == 0] 

助けてください

答えて

2

checkDiffのみ長さ0と1のリストを扱うそれはおそらく、トリガ、長いリストと呼ばれています。非網羅エラー。

あなたは-Wallフラグと警告をオンにする必要があります。その場合は、GHCはなくコンパイル時にこのような問題を報告します。

+0

あなたはcheckDiffは、長さ0と1のリストを処理する方法を理解しました? – Amateur

+1

@Amateur '[]'は長さ0、 '[((0、_)]'、 '[(_、0)]'および '[(a、b)]のリストです。それはあなたが持っているすべてのパターンです。 – sepp2k

+0

ありがとう。私はまだハスケルにとっては新しい人です。私は学ぶべきことがたくさんある。ありがとうございました。 – Amateur

関連する問題