Haskell模式匹配匹配映射。使用任意映射清空any。映射k v
我正在编写一个函数,该函数根据参数中的Map是否为空而具有不同的操作 这是我的密码:Haskell模式匹配匹配映射。使用任意映射清空any。映射k v,haskell,pattern-matching,Haskell,Pattern Matching,我正在编写一个函数,该函数根据参数中的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.
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) =
谢谢。您没有匹配
映射。empty
,您匹配的是empty
,它只是绑定到任何映射的局部变量。您无法匹配Map.empty
,因为它不是构造函数
你可以做的是:
testF m _ | Map.null m = [1024]
也就是说,使用防护装置检查
m
是否为空。我看到Map.Map
源代码给出了Tip
和Bin
构造函数Map k v
哪个empty=Tip
。根据这个wiki:,模式匹配可以匹配datafoo
中的构造函数。所以,问题是Data.Map.Lazy不导出Tip和Bin,对吗?@ccQpein对Map
是抽象的(实现是私有的),因此您不能直接访问它的构造函数。也可以在这里使用ViewPatterns
,testF(Map.null->True)=[1024]
,尽管在风格上我更喜欢这种简单情况下的保护。也可以为空映射编写模式同义词,但正如@JonPurdy所说的视图模式,这似乎不值得费心。实际上没有任何其他模式可以与之一起形成一个特别有用的集合。我的意思是,您可以编写模式来检查地图的第一个和最后一个元素,但这不是一个足够常见的操作。