Erlang 功能头中的地图模式匹配

Erlang 功能头中的地图模式匹配,erlang,pattern-matching,Erlang,Pattern Matching,我试图创建一个接受两个参数的函数,一个由三个元素组成的元组,以及一个分配元组值中最后两个元素的映射。例如,我会像这样调用函数 modulename:funcName({description, a,b}, #{a=>1, b=>2)). funcName({description,a,b}, #{a:=A, b:=2}. 我无法让模式匹配工作。我的功能是这样的 modulename:funcName({description, a,b}, #{a=>1, b=>2))

我试图创建一个接受两个参数的函数,一个由三个元素组成的元组,以及一个分配元组值中最后两个元素的映射。例如,我会像这样调用函数

modulename:funcName({description, a,b}, #{a=>1, b=>2)).
funcName({description,a,b}, #{a:=A, b:=2}.
我无法让模式匹配工作。我的功能是这样的

modulename:funcName({description, a,b}, #{a=>1, b=>2)).
funcName({description,a,b}, #{a:=A, b:=2}.

我无法将元组中的原子映射到映射中的值。如何执行此操作。

如果我正确理解您想要的内容,则函数头本身不可能执行此操作,因为用作映射键的所有变量都必须事先绑定。发件人:

下面是一个非法示例,表明仍然不支持将未绑定变量用作键模式表达式的一部分。在这种情况下,键没有绑定,要求键表达式中使用的所有变量必须事先绑定

illegal_example(Key, #{Key := Value}) -> Value.
所以你必须写这样的东西:

func_name({description, Key1, Key2}, Map = #{}) ->
    #{Key1 := Value1, Key2 := Value2} = Map,
    ....
这是因为在第二行,变量
Key1
Key2
已经绑定,因此它们可以用于匹配映射中相应键的值

或者,使用
maps:get
获得相同的结果:

func_name({description, Key1, Key2}, Map = #{}) ->
    Value1 = maps:get(Key1, Map),
    Value2 = maps:get(Key2, Map),
    ....
您可以分两步完成(以保持模式在功能头级别的匹配):

编辑

我只是重读了你的问题,现在不明白什么不起作用。这可以通过代码(和一个小的语法更正)一步完成:

您可以测试它:

1> test:funcName({description,a,b},#{a => "hello", b => 2}).
"hello"
2> test:funcName({description,a,b},#{a => "hello", b => 3}).
error
3> test:funcName({description,a,b},#{a => "hello", c => 2}).
error
4> test:funcName({description,a,b},#{aa => "hello", b => 2}).
error
5> test:funcName({description,a,bb},#{a => "hello", b => 2}).
error
6> test:funcName({description,a,b,c},#{a => "hello", b => 2}).
error
7>

这张地图不需要空地图吗?我不明白从何处获取Value1和Value2,因为它是一个空映射no,在模式匹配中,
{}
表示任何映射,无论是否为空。当is_map(map)时,添加
也可以达到同样的效果。这只是为了在第二个参数不是映射的情况下得到一个描述性错误,尽管您可以说下一行得到的错误匹配同样清楚。好的,但我仍然不明白Value1和Value2来自何处。我是否应该使用maps:get/2获取值?
Value1
Value2
通过模式匹配绑定到映射中相应键的值。你也可以使用
maps:get
——我添加了一个例子。好的,我把代码改成了这个,但是我仍然得到了这个警告和错误。我仍然无法用代码将原子映射到值,也许我应该更清楚。函数的输入应该类似于modulename:funcname({description,a,b},{a=>2,b=3})。所以我不明白这个函数名({description,a,b},{a:=a,b:=2})->a;这可能是解决办法。映射的atom b的值不应该在函数头中确定,而是由输入确定