非详尽模式匹配元组列表

时间:2017-04-30 19:58:59

标签: haskell

我不确定我在这里缺少什么,但我无法在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]

请帮忙。

1 个答案:

答案 0 :(得分:2)

checkDiff仅处理长度为零和一的列表。它可能用较长的列表调用,触发非穷举错误。

您应该使用-Wall标志打开警告。如果这样做,GHC将在编译时报告此类问题。