Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell模式匹配匹配映射。使用任意映射清空any。映射k v_Haskell_Pattern Matching - Fatal编程技术网

Haskell模式匹配匹配映射。使用任意映射清空any。映射k v

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.

我正在编写一个函数,该函数根据参数中的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) =
  • 为什么每个Map.Map都可以匹配Map.empty
  • 我应该如何实现我的要求

  • 谢谢。

    您没有匹配
    映射。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所说的视图模式,这似乎不值得费心。实际上没有任何其他模式可以与之一起形成一个特别有用的集合。我的意思是,您可以编写模式来检查地图的第一个和最后一个元素,但这不是一个足够常见的操作。