`
cnDenis
  • 浏览: 100327 次
  • 来自: 广州
社区版块
存档分类
最新评论

初识Erlang,Hello World(2)

阅读更多

初识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/1hw9/1中 的写法,我碰壁了好久,后来问了程序老大才解决的。

hw8/1是把函数名当参数后用,必须要使用fun关键词,而且要指明函数的目数, 这与Python不一样。Python一个函数名只能绑定一个函数,给出名字就唯一确定了绑定 对象。而Erlang允许同名不同目的函数,所以要指明目数。

hw9/1则是产生一个匿名函数作为参数,注意匿名函数的写法。以fun作为函数名, 其余跟一般函数没什么区别。注意fun后面的括号不要漏掉,即使没有参数。

分享到:
评论

相关推荐

    HelloWorld-main.zip

    【HelloWorld-main.zip】是一个包含了多种编程语言的“Hello, World!”程序源代码的压缩包。这个资源对于初学者来说非常有价值,因为它涵盖了从传统到现代的多种编程语言,可以帮助新接触编程的人快速理解每种语言的...

    各种程序语言的Hello_World程序

    module HelloWorld (main) where main = putStrLn "Hello World!\n" ``` **解析:** - Haskell是一种纯函数式编程语言。 - `module`定义模块。 - `putStrLn`用于输出字符串。 #### Icon ```icon procedure main() ...

    win64_erlang24.2.2

    win64位系统 。 erlang24.2.2。

    RabbitMQ hello world源码

    "RabbitMQ hello world源码"通常是指一个简单的示例,用于展示如何在RabbitMQ中发送和接收消息。这个例子可以帮助初学者快速理解RabbitMQ的基本工作原理和API使用。 **发送端(Producer)** 在RabbitMQ的"hello ...

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便...4. erlang安装后要检查能否编译成功一个helloworld文件。 5. rabbitMQ无法安装插件时非常有可能是erlang出问题了。

    RabbitMQ-HelloWorld:RabbitMQ的Hello World示例

    在RabbitMQ的"Hello World"示例中,首先要做的是建立一个到RabbitMQ服务器的连接,并创建一个信道。信道是RabbitMQ中的工作线程,通过它我们实际执行发布和消费消息的操作。 ```csharp using RabbitMQ.Client; ...

    RabbitMQ系列(一)入门Helloworld

    **RabbitMQ系列(一)入门Helloworld** RabbitMQ是一种开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中的异步处理和解耦。在这个系列的第一部分,我们...

    erlang22最新下载包

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。Erlang以其强大的并行处理能力、容错性和易于构建大规模分布式系统的特点,在电信、金融和互联网等...

    erlang学习1.pdf

    **运行程序**:启动Erlang Shell,并调用`helloworld:sayhello()`执行程序。 #### 三、TCP客户端实现 - **基本需求**:实现一个简单的TCP客户端,可以连接至Web服务器并显示服务器返回的数据。 - **实现过程**: ...

    erlang编程 Introducing Erlang

    ### 2. 并发与轻量级进程 Erlang的一大亮点是其内置的并发机制。它使用轻量级进程(Lightweight Processes, LWP)来实现并发,每个进程有自己的消息队列,通过消息传递进行通信。这种模型降低了同步的复杂性,提高...

    erlang25.0 windows版本

    2. **API更新**:可能对Erlang的内置函数或模块进行增强,提供新的功能或修复已知问题。 3. **兼容性提升**:与先前版本相比,25.0可能增强了与其他软件或框架的兼容性。 4. **错误修复**:解决上一版本中的已知问题...

    erlang_版本24.3.4.4

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...

    Erlang/OTP 26.2.1

    Erlang/OTP 26.2.1,Erlang,OTP,26.2.1

    erlang programming

    2. **并发编程**:Erlang的并发模型是其独特之处。它通过轻量级进程(Lightweight Processes, LWP)实现并发,进程间通信(Inter-Process Communication, IPC)主要依赖消息传递。Concurrent Programming in ERLANG...

    RabbitMQ3.9.13和ErLang24.2版本

    2. **容错性**:Erlang的错误恢复机制和热代码升级功能使得Erlang程序能在出现错误时优雅地重启,而不影响整个系统。这对于保持RabbitMQ的稳定性至关重要。 3. **分布式特性**:Erlang的分布式特性使得构建分布式...

    erlang资源

    2. ** OTP(Open Telecom Platform)**:OTP是Erlang生态系统的一部分,提供了设计模式、库和工具,用于构建可靠和可扩展的系统。书中可能讲解了OTP的设计原则和组件,如GenServer、GenEvent和Supervisor等。 3. **...

    erlang otp25 win安装包

    erlang otp25 win安装包

    erlang程序设计2

    erlang发明者写的书。erlang/otp一种高可靠性的平台。

Global site tag (gtag.js) - Google Analytics