Haskell模式匹配将Map.empty与任何Map.Map k v匹配

时间:2017-09-10 19:14:49

标签: haskell pattern-matching

如果Map是空的,我正在编写一个函数,该函数根据参数中的Map.Map具有不同的操作

这是我的代码:

import qualified Data.Map.Lazy as Map

testF :: (Ord a, Num a) => Map.Map a a -> [a] -> [a]
testF empty _  = [1024]
testF _ []     = []
testF m (x:xs) = [x] ++ (testF m xs)

main = do
  let a = Map.fromList [(1,2), (3,4)]
  print $ testF Map.empty [1,2,3] -- show [1024]
  print $ testF a [1,2,3] -- show [1024] too
  print $ a == Map.empty -- False

当然,GHC已经通知我,最新的功能是多余的。

Pattern match is redundant
   In an equation for ‘testF’: testF m (x : xs) =
  1. 为什么每个Map.Map都可以匹配Map.empty?
  2. 我应该怎样做才能实现我的要求?
  3. 谢谢。

1 个答案:

答案 0 :(得分:4)

您未与Map.empty匹配,而是与empty匹配,Map.empty只是一个本地变量,与任何地图相关联。您不能与testF m _ | Map.null m = [1024] 匹配,因为它不是构造函数。

你能做的是:

m

即。使用警卫来检查a是否为空。