Erlang,使用警卫之前的语法错误

Posted

技术标签:

【中文标题】Erlang,使用警卫之前的语法错误【英文标题】:Erlang, Syntax error before using a guard 【发布时间】:2015-02-24 15:37:25 【问题描述】:
map_search_pred(Map,Pred) where is_map(Map)-> map_search_pred(maps:to_list(Map), Pred);
map_search_pred([H|Tail], Pred) -> 
    case Pred(H) of
        true -> H;
        false -> map_search_pred(Tail, Pred)
    end;
map_search_pred([], Pred) -> error, Pred.

我在“where”第 7 行之前遇到语法错误,即此代码中的第 1 行。我不知道为什么会这样,但是我仍然是 erlang 的初学者,所以我可能在途中错过了一些东西。

【问题讨论】:

【参考方案1】:

以关键字when而不是where开头的保护序列,

Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
    Body1;
...;
Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
    BodyK.

where 应在代码中替换为when

map_search_pred(Map,Pred) when is_map(Map)-> map_search_pred(maps:to_list(Map), Pred);
map_search_pred([H|Tail], Pred) -> 
    case Pred(H) of
        true -> H;
        false -> map_search_pred(Tail, Pred)
    end;
map_search_pred([], Pred) -> error, Pred.

【讨论】:

以上是关于Erlang,使用警卫之前的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

之前的 Erlang 语法错误:'end'

为啥 erlang spawn 函数调用中出现语法错误 - “之前的语法错误:')'”?

之前的 Erlang 语法错误:第 55 行中的 'end'

为什么语法错误会出现在erlang spawn函数调用中 - “语法错误之前:')'”?

为啥 Erlang 中的模式匹配记录会抛出错误

Erlang 20.2的语法错误