Erlang程式设计与问题解决/初尝滋味

维基教科书,自由的教学读本
跳到导航 跳到搜索


二个例子[编辑]

之前提到, Erlang 是函数式编程语言。所谓函数式编程语言,是指语言中的物项都以函数为主要思考方式。1 先看第一个函数, square/1 ,2 求一个整数的平方值。

square(N) -> N * N.

用这个函数,执行 square(3) 会得到 9 。而执行 square(1.2) 会得到 1.44 。 square/1 函数对全部可能的输入数值,都做一样的动作:参数与自己相乘。这个函数的规则只有一条。

有时,函数要有二条规则。 Erlang 语言的写法,对每一条函数规则,都写一行对应的描述。让我们看看 sum/1 函数,它接收一列数字,就会把全部数字加总得到总和。

sum([]) -> 0;
sum([Num|Ns]) -> Num + sum(Ns).

二条规则分别依据不同的参数情况,做不同的处置。须注意二条规则之间有分号分隔,并最后以句号结束。应用函数时,将呼叫的函数与参数向二条规则依序由上到下比对,找到符合的情况就使该条规则生效。另外,可注意第二条规则是递回规则,而第一条规则是递回的底。

‘OK! 好像看得懂,不过,程式到底怎么写,怎么执行啊?’读者的心中可能会出现这样的疑问。

我把场面拉到具体层面,让我们往下看。

Erlang 执行环境的安装与设定[编辑]

要执行上述程式,要按照下列步骤进行:

  1. 下载并安装 Erlang 平台,
  2. 用文字编辑器撰写 Erlang 程式,
  3. 用 Erlang 执行环境载入 Erlang 程式、执行、然后阅读结果。

安装 Erlang 平台[编辑]

2010 年 9 月 15 日, Erlang 平台已经释出到 R14B 版本(R17B)。 (到网站下载) 一套 Erlang 平台包含一份编译器、一份直译器、一组 Erlang/OTP 程式库、 CORBA 、以及内部服务器通讯协定等等。网站提供 Windows 或 Linux 二进制安装档可方便安装,并且自动建立系统参考路径。

或者,可以下载源码自行编译。这样,相关软件套件要找齐,并且安装后要设定参考路径。资讯请读读说明书。

写程式[编辑]

如下图,将上述二则函数写上去,档案开头加上二行,一行是模组设定,一行是汇出设定。图中所示是使用 NTEmacs 编辑器外挂 Erlang 模组,做为程式编辑工具。

Erlang-edit.gif

执行程式[编辑]

如图,开启视窗界面的 Erlang 命令列,切换到目的资料夹,编译程式,然后呼叫二则函数。 Erlang 命令列会以可见的方式列出函数的解。

Erlang-run.gif

其他例子[编辑]

稍微看过 Erlang 如何运作之后,在后面的章节,本书即将告诉你,如何实现我们经常听到的算法:例如,快速排序法......

quick_sort([]) -> [];
quick_sort([X|Xs]) ->
    quick_sort([ Y || Y <- Xs, Y =< X ]) ++ [X] ++ quick_sort([ Z || Z <- Xs, Z > X ]).

有趣的数据结构与处理:例如,树的走访......

preorder(nil) -> [];
preorder({R, Lt, Rt}) -> [R] ++ preorder(Lt) ++ preorder(Rt).

著名问题的解决:例如,八皇后问题......

solve() ->
    RNums = lists:seq(1,8),
    Permu = permu(RNums),
    Results = lists:filter(fun no_attack_diagonal/1, Permu),
    show(Results).

过程随时运用 Erlang 的程式技巧及程式库,包含在内存中管理键值配对、储存档案、跨行程或网络通讯、以及图型界面控制等等。你会发现 Erlang 是个美妙的语言,因为以上所提到这些蛮有深度或蛮需要技术力、才堪虞实作的项目,在 Erlang 非常容易学会,并且几乎都只用 Erlang 就可以搞定。

注解[编辑]

  1. 函数式编程语言的思考方式以函数为主,这是什么意思呢?拿其他二种常听见的用语来比较,程序式和面向对象,应该可以略知端倪。
    • 程序式:也称为命令式,程式的每一行或每一个段落都是一组程序、流程。
    • 面向对象:程式中存在许多细项单元,每一项都视为物件。物件中的属性,也是物件。
    • 函数式:程式中存在的单元,大部分是函数。对于函数,我们会塞给它一些参数,以计算结果。函数的参数,也可以是函数。
  2. 我们对函数的一般表示法是“函数名称 / 参数数目”。 Erlang 借由这一组符号识别函数是否相同。