gpt4 book ai didi

erlang - 当模式匹配在 Erlang 中映射时,为什么这个变量是未绑定(bind)的?

转载 作者:行者123 更新时间:2023-12-02 05:57:01 25 4
gpt4 key购买 nike

-module(count).
-export([count/1]).

count(L) when is_list(L) ->
do_count(L, #{});
count(_) ->
error(badarg).

do_count([], Acc) -> Acc;
do_count([H|T], #{}) -> do_count(T, #{ H => 1 });
do_count([H|T], Acc = #{ H := C }) -> do_count(T, Acc#{ H := C + 1});
do_count([H|T], Acc) -> do_count(T, Acc#{ H => 1 }).

在此示例中,映射键“H”存在且具有与其关联的计数的第三个子句将无法编译。编译器提示:

count.erl:11: variable 'H' is unbound    

为什么H没有绑定(bind)?

顺便说一句,这是有效的:

do_count([], Acc) -> Acc;
do_count([H|T], Acc) -> do_count(T, maps:update_with(H, fun(C) -> C + 1 end, 1, Acc)).

但似乎模式匹配应该起作用,但事实并非如此。

最佳答案

答案与我最近在这里给出的答案几乎相同: https://stackoverflow.com/a/46268109/240949 .

当您在一个模式中多次使用同一变量时,如本例中的 H:

do_count([H|T], Acc = #{ H := C }) -> ...

Erlang 中模式匹配的语义表明这就像你写的一样

do_count([H|T], Acc = #{ H1 := C }) when H1 =:= H -> ...

也就是说,首先将它们分别绑定(bind),然后比较是否相等。但是需要知道映射模式中的键 - 它不能是像 H1 这样的变量,因此会出现错误(正如我链接到的答案中的二进制模式中的字段大小说明符一样)。

这个问题的主要区别是你有一个带有两个单独参数的函数头,你可能认为模式 [H|T] 应该首先匹配,在尝试第二个模式之前绑定(bind) H,但是有无此类订购保证;就像您使用了带有元组模式 {[H|T], #{ H := C }} 的单个参数一样。

关于erlang - 当模式匹配在 Erlang 中映射时,为什么这个变量是未绑定(bind)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46377003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com