2016-03-07 3 views
0

Я написал следующую функцию:Странная картина сопоставления терпят неудачу в Haskell

addToDT :: (Ord a) => DocumentTable a -> [a] -> DocumentTable a 
addtoDT t [] = t 
addToDT t (x:xs) = 
    addToDT DocumentTable { tableLength = tableLength t + maybe 0 (const 1) (M.lookup x (table t)) 
         , table = M.insertWith (+) x 1 (table t) 
         } xs 

DocumentTable быть карта, которая хранит его длину:

data DocumentTable a = DocumentTable { table :: Map a Int 
            , tableLength :: Int 
            } 

addToDT делает карту, содержащую для каждого разные a в списке его количество встречаемости.

Когда я его использую, я получаю Non-exhaustive patterns in function addToDT. traceShow показал, что это произошло, когда addToDT вызывается с пустым списком. Если я заменил addToDT на:

addToDT :: (Ord a) => DocumentTable a -> [a] -> DocumentTable a 
addToDT t xxx 
    | null xxx = t 
    | otherwise = addToDT DocumentTable { tableLength = tableLength t + maybe 0 (const 1)(M.lookup x (table t)) 
             , table = M.insertWith (+) x 1 (table t) 
             } xs 
    where (x:xs) = xxx 

Тогда это работает ... но я действительно не понимаю, почему. Может ли кто-нибудь объяснить мне, почему соответствие шаблонов не удается?

+3

'-Wall' будет указывать на ошибки, как это. –

+2

Вы ошибочно написали 'addToDT' как' addtoDT' (строчный «t») в случае с пустым списком. – chepner

ответ

1

Просто

addtoDT t [] = t -- this is another function since `to` isn't `To` 

:)

+0

Ммм ... это неловко. Большое спасибо! – villou24

Смежные вопросы