Haskell 模式匹配将 Map.empty any 与任何 Map.Map kv 匹配

ccQ*_*ein 0 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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你。

mel*_*ene 7

你不匹配Map.empty,你匹配empty,它只是一个绑定到任何映射的局部变量。你不能匹配,Map.empty因为它不是一个构造函数。

你可以做的是:

testF m _ | Map.null m = [1024]
Run Code Online (Sandbox Code Playgroud)

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

  • 也可以在这里使用`ViewPatterns`,`testF (Map.null -> True) _ = [1024]`,虽然在风格上我更喜欢这种简单情况的守卫。 (3认同)