首页 文章

Haskell中的奇怪模式匹配失败[关闭]

提问于
浏览
0

我写了以下函数:

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 回答

  • 1

    只是

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

    :)

相关问题