Erlang编程实践启示

来源:互联网 发布:java linux ping ip 编辑:程序博客网 时间:2024/05/29 18:55

近日,在QQ聊天中看到一个做Erlang编程练习题,大致就是判断一个列表是否在另一个列表中出现。

实际上,我虽然学习Erlang有段时间,但没有真正去编写过软件或做大量编程。最初我写了这样一段程序来实现这个功能:

-module(test).-export([forteen/2]).forteen(A,B)->fun_sec(A,B,A,B0).fun_sec(_,[],_,_,_)->false;fun_sec([Ha|Ta],[Hb|Tb],A,B,Sum) when Ha==Hb ->    if        length(Ta)==0 ->[true,Sum];        true ->fun_sec(Ta,Tb,A,B,Sum)    end;fun_sec(_,_,A,B,Sum)->    fun_sec(A,myy(Sum+1,B),A,B,Sum+1).myy(_,[])->[];myy(Sum,[_|T]) when Sum /=0 ->myy(Sum-1,T);myy(0,B)->B.

但总觉得不够Erlangic,于是再另行编写,最后结果如下:

-module(test).-export([forteen/2]).forteen(A,B)->fun_sec(A,B,[],0).fun_sec([],_,_,Sum) -> [true,Sum];fun_sec(A,B,_,_) when length(A)>length(B) -> false;fun_sec([H|Ta],[H|Tb],Samelst,Sum) ->fun_sec(Ta,Tb,[H|Samelst],Sum);fun_sec(A,[_|T],[],Sum)->fun_sec(A,T,[],Sum+1);fun_sec(A,B,Samelst,Sum)-> [_|T]= myy(Samelst,B),fun_sec(myy(Samelst,A),T,[],Sum+1).myy([],Res) -> Res;myy([H|T],Res) -> myy(T,[H|Res]).

姑且不谈程序的正确性如何,我觉得在编写Erlang程序时,还是与其它语言有较大的思维差别的。我觉得一般来说,其它语言很容易将功能处理单元写的很大,因为所有的处理都会在其中完成,写着写着就会大的不可收拾。记得看过一个公开课视频中一位JAVA老师说过,一个功能单元一般不应超过15个语句,再多的话,就要考虑分为另一个功能单元来完成。第一个程序,很显然有在功能单元中完成一切的倾向,所以并没有Erlangic,没有充分利用Erlang的匹配功能,而是将其放到when或if中。当然这里也不是说在函数中就不能用这些复杂的语句。既然简单的语句能处理好,何必写这么复杂的语句呢?

再看第二个程序,就是充分利用了函数参数中的匹配功能,从而达到简化函数内部语句的复杂性,从而使程序更易懂、易读。

0 0