从零开始学习Erlang语言:learnxinyminutes-docs核心教程
前言
Erlang是一种函数式编程语言,由爱立信公司开发,特别适合构建高并发、分布式和容错系统。本文基于learnxinyminutes-docs项目中的Erlang教程,将全面介绍Erlang的核心概念和语法特性。
基础语法
注释与标点
Erlang使用三种注释方式:
- 单行注释:
%
- 函数注释:
%%
- 模块注释:
%%%
三种标点符号的用法:
- 逗号(
,
): 分隔函数参数、数据构造器和模式 - 句号(
.
): 分隔完整函数和shell表达式 - 分号(
;
): 分隔子句
变量与模式匹配
Erlang变量命名以大写字母开头,采用单次赋值(不可变):
Num = 42. % 正确
num = 42. % 错误,变量名必须大写
Num = 43. % 错误,Num已绑定为42
=
操作符实际上是模式匹配操作,而非传统赋值:
{point, X, Y} = {point, 10, 45}. % X匹配为10,Y匹配为45
数据类型
原子(Atom):以小写字母开头的常量符号
Hello = hello.
OtherNode = example@node.
元组(Tuple):固定长度的复合数据类型
Point = {point, 10, 45}.
{point, X, Y} = Point. % 解构元组
列表(List):动态长度的元素集合
ThingsToBuy = [{apples, 10}, {pears, 6}, {milk, 3}].
[First|Rest] = ThingsToBuy. % 模式匹配分解列表
字符串:在Erlang中实际上是整数列表
"Hello" = [72, 101, 108, 108, 111].
函数式编程
模块与函数
Erlang代码组织在模块中,模块文件扩展名为.erl
:
-module(geometry).
-export([area/1]). % 导出area/1函数
area({rectangle, Width, Ht}) -> Width * Ht;
area({circle, R}) -> 3.14159 * R * R.
编译和执行:
c(geometry). % 编译
geometry:area({rectangle, 10, 5}). % 调用
匿名函数(Fun)
Double = fun(X) -> 2 * X end.
Double(2). % 返回4
% 高阶函数
Mult = fun(Times) -> (fun(X) -> X * Times end) end.
Triple = Mult(3).
列表推导
简洁的列表生成方式:
[2 * X || X <- [1,2,3,4,5]]. % [2,4,6,8,10]
[N || N <- [1,2,3,4], N rem 2 == 0]. % [2,4]
守卫(Guard)
增强模式匹配的能力:
max(X, Y) when X > Y -> X;
max(X, Y) -> Y.
记录与流程控制
记录(Record)
定义命名字段的复合结构:
-record(todo, {
status = reminder, % 默认值
who = joe,
text
}).
case表达式
filter(P, [H|T]) ->
case P(H) of
true -> [H|filter(P, T)];
false -> filter(P, T)
end.
if表达式
max(X, Y) ->
if
X > Y -> X;
X < Y -> Y;
true -> nil % 必须有一个分支为真
end.
异常处理
Erlang有三种异常生成方式:
generate_exception(1) -> a;
generate_exception(2) -> throw(a);
generate_exception(3) -> exit(a);
generate_exception(4) -> {'EXIT', a};
generate_exception(5) -> erlang:error(a).
捕获异常:
try generate_exception(N) of
Val -> {N, normal, Val}
catch
throw:X -> {N, caught, thrown, X};
exit:X -> {N, caught, exited, X};
error:X -> {N, caught, error, X}
end.
并发编程
Erlang基于Actor模型实现并发:
% 创建进程
spawn(fun() -> 2 + 2 end).
% 消息传递
CalculateArea = spawn(calculateGeometry, calculateArea, []).
CalculateArea ! {circle, 2}. % 发送消息
% 接收消息
calculateArea() ->
receive
{rectangle, W, H} -> W * H;
{circle, R} -> 3.14 * R * R
end.
单元测试
使用EUnit进行测试:
-module(fib).
-include_lib("eunit/include/eunit.hrl").
fib(0) -> 1;
fib(1) -> 1;
fib(N) when N > 1 -> fib(N-1) + fib(N-2).
fib_test_() ->
[?_assert(fib(0) =:= 1),
?_assertException(error, function_clause, fib(-1))
].
总结
本文全面介绍了Erlang的核心概念,包括:
- 基本语法和数据类型
- 函数式编程特性
- 模式匹配和守卫
- 记录和流程控制
- 异常处理机制
- Actor并发模型
- 单元测试方法
Erlang独特的并发模型和容错特性使其在电信、金融和即时通讯等领域有着广泛应用。通过掌握这些核心概念,开发者可以构建高可靠性的分布式系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考