Data.Map上的模式匹配

时间:2014-07-13 10:29:45

标签: haskell

我做了一次搜索,但令人惊讶的是,没有找到任何可以帮助我对它进行模式匹配的东西。我需要确保在我的Map“变量”中正好有3个键。而已。而不是“if ... then ... else”,我想要使用模式匹配,因为它更容易阅读,似乎更像是haskell方式。所以:

myFunction :: Map String String
--.......................

main = do
  let var1 = myFunction
  -- how do I ensure it has exactly 3 keys in it and if not raise an error?  

2 个答案:

答案 0 :(得分:11)

您无法对抽象数据类型进行模式匹配,因为您无法访问其构造函数¹,因此您必须使用`Data.Map'模块提供的函数。

但请注意,您可以使用size :: Map k a -> Int功能。如果您不喜欢if .. then .. else ..(这绝不是错误或不合适),您可以使用模式保护:

foo m | size m == 3 = ...
      | otherwise = error "Not three element"

¹忽略视图模式和模式同义词,但这些只是语法上的表达。

答案 1 :(得分:4)

你可以在M.toList上模式匹配:

import qualified Data.Map as M
-- ...
main = do
  case (M.toList myFunction) of
    [a,b,c] -> ... -- exactly 3 arguments
    _       -> ... -- more or less than 3 arguments