Я написал следующую функцию:Странная картина сопоставления терпят неудачу в 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
Тогда это работает ... но я действительно не понимаю, почему. Может ли кто-нибудь объяснить мне, почему соответствие шаблонов не удается?
'-Wall' будет указывать на ошибки, как это. –
Вы ошибочно написали 'addToDT' как' addtoDT' (строчный «t») в случае с пустым списком. – chepner