我做了一次搜索,但令人惊讶的是,没有找到任何可以帮助我对它进行模式匹配的东西。我需要确保在我的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?
答案 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