初识Erlang,Hello World(2)
by cnDenis 2013年3月12日
昨天费了老大劲终于把Hello World打出来了,今天我们继续。
说N遍Hello World,递归的使用
Hello World说一遍怎么够呢,说N遍吧。代码如下:
-module(helloworld).
-export([hw3/1]).
% 打印N遍Hello world
hw3(N) when N > 0 ->
io:format("Hello World ~n"),
hw3(N-1);
hw3(0) -> ok.
这有什么好坑的呢:
hw3(N) when N > 0 ->
when后面是一个guard,仅在它为true时函数会被执行。
保护元所能使用的语句是受限的,不能用自定义的函数。
io:format("Hello World ~n"),
hw3(N-1);
这一个函数体有多条语句,中间需要用逗号隔开
hw3(0) -> ok.
hw3/1这个函数有几个函数子句,根据参数的模式识别和when保护元的值来选择使用函数体。
不同的函数体之间使用分号,最后一个末尾使用句点。
啥都不干用什么好呢?stackoverflow 上说用ok. 那就用ok吧。
再说N遍Hello World,使用case
如果不想用多个函数子句的话,可以用case
hw5(N) ->
case N of
X when X > 0 ->
io:format("Hello World ~n"),
hw5(N-1);
0 -> ok
end.
case的语法是:
case 条件表达式 of ->
模式1 -> 语句段1;
模式2 -> 语句段2;
....
模式N -> 语句段N
end
继续一行一行看:
case N of
N是条件表达式,也就是说运行case中的哪一条子句会根据N的值来决定。
只有一个子句会被执行,这点跟C语言不一样。
而且如果全部子句的模式匹配都失败的话,会抛出错误。所以要考虑是否使用catch all的语句。
条件表达式与子句之间是用of来分隔的,注意不要顺手打冒号了。
X when X > 0 ->
模式后面可以接when,也可以不用。
这一行是这么运行的:首先是对X和N进行模式匹配,即X=N
,匹配是成功的,因为 变量X没有赋值,所以X绑定到N,然后由于保卫元X>0
为true,所以执行该子句。
io:format("Hello World ~n"),
hw5(N-1);
注意模式与语句段之间是用 ->
分开的,中间的case语句段需要以分号结束
0 -> ok
递归结束条件,不可忘记的。最后一个case子句,也就是end之前不需要加标点。
end.
case语句需要以end结束,后面这个句点是表示hw5整个函数的结束,不是case语法的一部分
继续说Hello World,使用if
if可以视为没有条件表达式和of的case
hw6(N) ->
if
N > 0 ->
io:format("Hello World ~n"),
hw5(N-1);
N == 0 ->
ok
end.
if的语法格式是:
if
保护元1 -> 语句1;
保护元2 -> 语句2;
.......
保护元N -> 语句N
end
if会执行第一个保护元为真的语句。
要注意的东西跟case没什么区别,就不啰嗦了。
继续Hello World,使用列表解析
这似乎是最简洁的做法了
hw7(N) ->
[hw() || _ <- lists:seq(1, N) ].
这句话换相当于Python中的 [hw() for _ in range(1, N + 1)]。
意思是把(1,2,3...N)中的每一个值都装到变量_之后,运行hw()。由于hw中不调用 seq中产生的值,所以拿_这样的一个坑来装。
lists:seq
是产生一个连接序列的数组,与Python中的range不同的是,它是既包头又包 尾的,也是就说产生(1,2,3...N)。
继续Hello World,山寨for
Erlang最令人觉得奇怪的是它没有循环语句,不过这不妨碍我们直接山寨一个。
for(I, N, F) when I < N ->
F(),
for(I + 1, N, F);
for(N, N, F) ->
F().
hw8(N) ->
for(1, N, fun hw/0).
hw9(N) ->
for(1, N, fun() -> hw() end).
这个山寨的for用了高阶函数的概念,它的F参数是是一个函数。注意hw8/1
和hw9/1
中 的写法,我碰壁了好久,后来问了程序老大才解决的。
hw8/1
是把函数名当参数后用,必须要使用fun关键词,而且要指明函数的目数, 这与Python不一样。Python一个函数名只能绑定一个函数,给出名字就唯一确定了绑定 对象。而Erlang允许同名不同目的函数,所以要指明目数。
hw9/1
则是产生一个匿名函数作为参数,注意匿名函数的写法。以fun作为函数名, 其余跟一般函数没什么区别。注意fun后面的括号不要漏掉,即使没有参数。
相关推荐
【HelloWorld-main.zip】是一个包含了多种编程语言的“Hello, World!”程序源代码的压缩包。这个资源对于初学者来说非常有价值,因为它涵盖了从传统到现代的多种编程语言,可以帮助新接触编程的人快速理解每种语言的...
module HelloWorld (main) where main = putStrLn "Hello World!\n" ``` **解析:** - Haskell是一种纯函数式编程语言。 - `module`定义模块。 - `putStrLn`用于输出字符串。 #### Icon ```icon procedure main() ...
win64位系统 。 erlang24.2.2。
"RabbitMQ hello world源码"通常是指一个简单的示例,用于展示如何在RabbitMQ中发送和接收消息。这个例子可以帮助初学者快速理解RabbitMQ的基本工作原理和API使用。 **发送端(Producer)** 在RabbitMQ的"hello ...
esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便...4. erlang安装后要检查能否编译成功一个helloworld文件。 5. rabbitMQ无法安装插件时非常有可能是erlang出问题了。
在RabbitMQ的"Hello World"示例中,首先要做的是建立一个到RabbitMQ服务器的连接,并创建一个信道。信道是RabbitMQ中的工作线程,通过它我们实际执行发布和消费消息的操作。 ```csharp using RabbitMQ.Client; ...
**RabbitMQ系列(一)入门Helloworld** RabbitMQ是一种开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中的异步处理和解耦。在这个系列的第一部分,我们...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。Erlang以其强大的并行处理能力、容错性和易于构建大规模分布式系统的特点,在电信、金融和互联网等...
**运行程序**:启动Erlang Shell,并调用`helloworld:sayhello()`执行程序。 #### 三、TCP客户端实现 - **基本需求**:实现一个简单的TCP客户端,可以连接至Web服务器并显示服务器返回的数据。 - **实现过程**: ...
### 2. 并发与轻量级进程 Erlang的一大亮点是其内置的并发机制。它使用轻量级进程(Lightweight Processes, LWP)来实现并发,每个进程有自己的消息队列,通过消息传递进行通信。这种模型降低了同步的复杂性,提高...
2. **API更新**:可能对Erlang的内置函数或模块进行增强,提供新的功能或修复已知问题。 3. **兼容性提升**:与先前版本相比,25.0可能增强了与其他软件或框架的兼容性。 4. **错误修复**:解决上一版本中的已知问题...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...
Erlang/OTP 26.2.1,Erlang,OTP,26.2.1
2. **并发编程**:Erlang的并发模型是其独特之处。它通过轻量级进程(Lightweight Processes, LWP)实现并发,进程间通信(Inter-Process Communication, IPC)主要依赖消息传递。Concurrent Programming in ERLANG...
2. **容错性**:Erlang的错误恢复机制和热代码升级功能使得Erlang程序能在出现错误时优雅地重启,而不影响整个系统。这对于保持RabbitMQ的稳定性至关重要。 3. **分布式特性**:Erlang的分布式特性使得构建分布式...
2. ** OTP(Open Telecom Platform)**:OTP是Erlang生态系统的一部分,提供了设计模式、库和工具,用于构建可靠和可扩展的系统。书中可能讲解了OTP的设计原则和组件,如GenServer、GenEvent和Supervisor等。 3. **...
erlang otp25 win安装包
erlang发明者写的书。erlang/otp一种高可靠性的平台。