当前位置:  开发笔记 > 编程语言 > 正文

Erlang**异常错误:没有函数子句匹配

如何解决《Erlang**异常错误:没有函数子句匹配》经验,为你挑选了1个好方法。

嗨,大家好,我有一个定理证明器解析器的气质.我有一个模块,它先前将字符串标记为即时输入:[{bracket,open},{prop,a},{logicOp,'和'},{prop,b},{bracket,close}]到解析器有一个内部函数调用.这是代码:

parse([])-> [];
parse(FullList) ->
    parseClauses(FullList,[],[]).


parseClauses([{bracket, open}| RestOfList], StackList, ParsedList) ->
    parseClauses(RestOfList, 
            StackList ++ [{bracket, open}], 
                ParsedList);

parseClauses([{prop, Any},{logicOp, Any}| RestOfList], StackList, ParsedList) ->
    parseClauses(RestOfList, 
             StackList ++ [{logicOp, Any},{prop, Any}], 
                ParsedList);

parseClauses([{bracket, close}, {logicOp, Any}| RestOfList],StackList,ParsedList) ->
    parseClauses(RestOfList, 
             StackList ++ [{bracket, close}], 
                [{logicOp, Any}] ++ ParsedList);

parseClauses([{bracket, close}|RestOfList], StackList, ParsedList) ->
    parseClauses(RestOfList,
                    StackList++[{bracket, close}],
                        ParsedList);

parseClauses([], Stack, Parsed) ->  Parsed ++ Stack.

像这样在终端上运行代码并得到错误:

tokeniser:parse([{bracket,open},
    {prop,a},
    {logicOp,'and'},
    {prop,b},
    {bracket,close}]).
** exception error: no function clause matching tokeniser:parseClauses([{prop,a},{logicOp,'and'},{prop,b},{bracket,close}],
                                       [{bracket,open}],
                                       [])

legoscia.. 5

从错误消息中,您可以告诉函数被调用如下:

tokeniser:parseClauses([{prop,a},{logicOp,'and'},{prop,b},{bracket,close}],
                                       [{bracket,open}],
                                       [])

几乎符合这个条款:

parseClauses([{prop, Any},{logicOp, Any}| RestOfList], StackList, ParsedList) ->

但由于Any在参数列表中使用了两次,因此该子句仅在两个值相同时才匹配.在这次电话会议中,它们是不同的:a'and'.

您可以将两个出现的内容更改Any为其他内容,例如PropLogicOp,并且该子句将接受两个不同的值.



1> legoscia..:

从错误消息中,您可以告诉函数被调用如下:

tokeniser:parseClauses([{prop,a},{logicOp,'and'},{prop,b},{bracket,close}],
                                       [{bracket,open}],
                                       [])

几乎符合这个条款:

parseClauses([{prop, Any},{logicOp, Any}| RestOfList], StackList, ParsedList) ->

但由于Any在参数列表中使用了两次,因此该子句仅在两个值相同时才匹配.在这次电话会议中,它们是不同的:a'and'.

您可以将两个出现的内容更改Any为其他内容,例如PropLogicOp,并且该子句将接受两个不同的值.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有