我写了以下函数:
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
是存储其长度的 Map :
data DocumentTable a = DocumentTable { table :: Map a Int
, tableLength :: Int
}
addToDT
制作一个 Map ,其中包含列表中每个不同的 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
然后它工作......但我真的不明白为什么 . 有人可以向我解释为什么模式匹配失败了吗?
1 回答
只是
:)