【问题标题】:Why do i get syntax error before a guard in Erlang?为什么我在 Erlang 的守卫之前会出现语法错误?
【发布时间】:2019-11-25 23:50:04
【问题描述】:

我试图理解为什么我在 Erlang 中的守卫中出现此错误:

> d:/Intro/hello.erl:17: syntax error before: 'when'
> d:/Intro/hello.erl:13: function dispatch/1 undefined
> d:/Intro/hello.erl:2: Warning: export_all flag enabled - all functions
> will be exported error

代码

-module(hello).
-compile([export_all,debug_info]).
-export([pany/1]).


isList([])->true;
isList([_|_])->true;
isList(_)->false.

pany(X)->
    IsList=isList(X),
    Result=if IsList == true -> "Its a list";
              IsList == false -> dispatch(X)
            end,
    Result.

dispatch(T)-> when T>3 ->
    Val=if T > 4 -> 55 ;
           T >5 -> 66 ;
        end,
    if (Val+1)==67 -> "lalalal" end;
dispatch(_)->"no result".

为什么说dispatch 是未定义的?我不想导出它,它只在模块内部使用。 在 if 中使用复杂表达式的结果也有问题吗?我知道你不允许在警卫中使用用户定义的表达式,但我想表达式的结果是好的。

【问题讨论】:

    标签: erlang guard


    【解决方案1】:

    在定义函数时,-> 总是函数头中的最后一件事,所以守卫总是在 -> 之前。

    在dispatch 中的守卫之后的 if 语句中

     Val=if T > 4 -> 55 ;
               T >5 -> 66 ;
            end,
    

    您正在定义两个匹配项。 ; 只需要以匹配结束一行,如果它后面是另一个匹配。在具有多个头的函数、case 语句等中就是这种情况。一个好的经验法则是,如果你在 ending 一个语句,你不需要在它前面加上 ;。

    【讨论】:

      【解决方案2】:

      首先,您添加了编译选项-compile([export_all,debug_info]).,因此它将启用导出模块中的所有功能。解决方法:删除它

      您的dispatch/1 函数有一些冗余-> 和;。你应该像下面这样改变它:

      -module(test).
      -compile([debug_info]).
      -export([pany/1]).
      
      
      isList([])->true;
      isList([_|_])->true;
      isList(_)->false.
      
      pany(X)->
          IsList=isList(X),
          Result=if IsList == true -> "Its a list";
                    IsList == false -> dispatch(X)
                  end,
          Result.
      
      dispatch(T) when T>3 ->
          Val=if T > 4 -> 55 ;
                 T >5 -> 66 
              end,
          if (Val+1)==67 -> "lalalal" end;
      dispatch(_)->"no result".
      

      【讨论】:

        猜你喜欢
        • 2015-02-24
        • 2019-03-09
        • 2015-10-13
        • 2015-12-11
        • 1970-01-01
        • 2014-06-08
        • 2017-11-27
        • 1970-01-01
        • 2014-03-19
        相关资源
        最近更新 更多