erlang模块的基本结构

基本结构
-module(filename).
-export([funname/num]).

c(filename). 编译erlang模块  .bean 结尾的文件 编译后的文件

q()  quit的别名 受控的方式停止了系统  init:stop()的别名   会提前关闭所有的资源.

elang:halt(). 立即停止系统

% 后面的内容是注释

多进制表示整数

16#cafe * 32#sugar

变量必须是大写字母开头   一次性变量赋值  否则得到 badmatch 错误

分为绑定变量和未绑定变量   erlang 没有可变状态 没有共享内存 也没有锁

整数除法的时候 自动装化成小数 然后进行运算  所以结果一定是小数
div rem

原子

被用于表示常量值  原子具有全局性 小写字母开头 字母 数字 _ @
还可以放在 单引号里面 原子的值就是它本身  'a' 和 a 没有任何区别

每一个表达式必须要有值

元祖 大括号
{point,14,2} 这样可以是可读性增强 这是一种推荐的编程风格  并不是强制的
元组还可以嵌套
提取元祖里面的值 _ 被称为匿名变量 不必绑定为相同的值

列表 中括号
里面可以是任何类型
列表头 可以是任何事物 但是列表尾一定要是一个列表
访问列表头是一种非常高效的操作

字符串

整数组成的列表 或者一个二进制型
当所有的都是可打印字符 那么就会是一个字符串

$a 代表字符a的整数

X="a\x{221e}b"
io:format("~ts~n",[X])

io:format("~w~n",["abc"]) [97,98,99]

[H}T]="abc" H=97

f(). 忘记所有绑定

cd(DIR).  pwd(). ls().

函数
没有显示的返回结果 他的返回值就是字句的最后一条语句

, 分隔参数    ; 分隔子句

total([])->0;
total([{What,N}}H])->
     shop:cost(What)*N + total(H).

fun:基本的抽象但单元

Double=fun(X,Y)->math:sqrt(X*X+Y*Y) end.
如果有多个不同的子句
TempConvert=fun({c,C})->{f,32+C*9/5};
        ({f,F})->{c,(F-32)*5/9} end.

*函数作为参数lists:map(fun(X)->2*X end.,L)

lists:filter(fun(X)->X rem 2 =:= 0 end.,L).

* 函数作为返回值
MakeTest=fun(L)->(fun(X)->lists:member(X,L) end) end.

定义自己的控制抽象
for(Max,Max,F)->[F(Max)];
for(I,Max,F)->[F(I)|for(I+1,Max,F)].

sum([H|T])->H+sum(T);
sum([])->0.

map(_,[])->[];
map(F,[H,T])->[F(H)|map(F,T)].

total(L)->
sum(map(fun({What,N})->cost(What)*N end,L)).

列表推导
lists:map(fun(X)->2*X end,L).

[2*X || X <- L].

lists:sum([shop:cost(A)*B] || {A,B} <- Buy).

后面可以是生成器 位串 过滤器

快速排序
qsort([])->[];
qsort(Prev|H)->
  qsort([X || X <- T,X<Prev])
  ++ [Prev] ++
  qsort([X || X <-T,X>Prev]).

毕达哥拉斯三元组
pythag(N)->
[{A,B,C} || A <- lists:seq(1,N),
B <- lists:seq(1,N),
C <- lists:seq(1,N),
A+B+C =<N,
A*A+B*B =:= C*C]

回文构词
perms([])->[[]];
perms(L)->[[H|T] || H <- L, T <- perms(L--[H])].

X--Y 是列表一处操作符

工作:去取出第一个字符 然后去掉这个字符 然后再次取

内置函数
list_to_tuple(L) 将列表转化为元祖
time() 返回 {时,分,秒}

这些最常用的是自动导入的 不需要加前缀 erlang:

is_atom(X)                X是一个原子
is_binary(X)              X是一个二进制型
is_constant(X)          X是一个常量
is_float(X)                 X是一个浮点数
is_function(X)           X是一个fun
is_function(X, N)      X是一个带有N个参数的fun
is_integer(X)            X是一个整数
is_list(X)                   X是一个列表
is_map(X)                X是一个映射组
is_number(X)           X是一个整数或浮点数
is_pid(X)                  X是一个进程标识符
is_pmod(X)              X是一个参数化模块的实例
is_port(X)                 X是一个端
is_reference(X)        X是一个引用
is_tuple(X)               X是一个元组
is_record(X,Tag)      X是一个类型为Tag的记录
is_record(X,Tag,N)  X是一个类型为Tag、大小为N的记录

abs(X)                     X的绝对值
byte_size(X)           X的字节数,X必须是一个位串或二进制型
element(N, X)         X里的元素N,注意X必须是一个元组
float(X)                   将X转换成一个浮点数, X必须是一个数字
hd(X)                      列表X的列表头
length(X)                列表X的长度
node()                    当前的节点
node(X)                  创建X的节点, X可以是一个进程、标识符、引用或端口
round(X)                将X转换成一个整数, X必须是一个数字
self()                      当前进程的进程标识符
size(X)                  X的大小,它可以是一个元组或二进制型
trunc(X)                将X去掉小数部分取整, X必须是一个数字
tl(X)                      列表X的列表尾
tuple_size(T)       元组T的大小

关卡 用于增加模式匹配的威力

max(X,Y) when X > Y ->X;
max(X,Y) ->Y.

关卡序列 ;分割开来 其中一个为true 就为 true
关卡是有一系列表达式 组成 ,分割 所有为true 才为true

关卡不能调用用户定义的函数 因为要确保没有副作用

is_tuple(T) tuple_size(T) abs(A)
element(4,X) hd(L) 开头

使用 布尔表达式
A>=-1.0 andalso A+1>B

is_atom(L) orelse (is_list(L) andalso length(L)>2)

and andalso      and 和 or 不管怎样两边都会求值
or orelse

case语句

case Expression of
  pattern1 when -> ..;
  pattern2 when -> ..;
  end

例子:

filter(P,[H|T])->
  case P(H) of
    true -> [H|filter(P,T)];
    false -> filter(P,T)
  end;
filter(P,[])->[].

就算没有case也能完成

filter(P,[H,T])->filter1(P(H),H,P,T);
filter(P,[])-> [].

filter1(true,H,P,T) ->[H,filter(P,T)];
filter1(false,H,P,T) -> filter(P,T).

if 表达式  经常会在最后加上关卡true 避免报错

List ++ [H]  不要这么干 这是很低效的

归集器

需求:得到一个列表的奇数和偶数

odds_and_events(L) ->
  Odds=[X || X <- L, (X rem 2) =:= 1],
  Events=[X || X <-L ,(X rem 2) =:=0],
  {Odds,Events}.

问题在于 遍历了两次

重写

odds_and_events(L)->
  odd_and_events_acc(L,[],[]).

odd_and_events_acc([H,T],Odds,Events)->
  case (H rem 2) of
    1 -> odd_and_events_acc(T,[H | Odds],Events);
    0 -> odd_and_events_acc(T,Odds,[H,Events])
  end;
odd_and_events_acc([],Odds,Events)->
  {Odds,Events}.

erlang程序设计--顺序编程的更多相关文章

  1. Erlang 101 Erlang环境和顺序编程

    笔记系列 Erlang环境和顺序编程 Erlang并发编程 Erlang分布式编程 Yaws Erlang/OTP 日期              变更说明2014-10-12 A outline, ...

  2. 《Erlang程序设计(第2版)》

    <Erlang程序设计(第2版)> 基本信息 作者: (瑞典)Joe Armstrong 译者: 牛化成 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115354 ...

  3. Erlang程序设计(第2版)读书笔记(一)

    正如<代码的未来>中所说,为了充分利用多核,并发变成将成为未来发展的趋势,对于并发编程的支持,Erlang确实是不二之选,Erlang在国内仍然较为小众,经典书籍相对也要少很多,最终选择了 ...

  4. 《C语言程序设计》编程总结汇总

    <C语言程序设计>编程总结汇总 院系: 专业年级: 班级名称: 学号: 姓名: 指导教师: 完成时间: 自我评价: 计算机科学与技术专业教研室 2018 年秋季学期 第四周编程总结 题目4 ...

  5. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

  6. erlang 编程指南 第三章-顺序编程 课后练习

    1. sum(3) => 6; sum(1,3) => 6; sum(6,6) => 6; sum(N) when is_integer(N) -> sum_acc(N,0); ...

  7. 《erlang程序设计》学习笔记-第3章 分布式编程

    http://blog.csdn.net/karl_max/article/details/3985382 1. erlang分布式编程的基本模型 (1) 分布式erlang:这种模型可以让我们在一个 ...

  8. 《Erlang程序设计》学习笔记-第2章 并发编程

    http://blog.csdn.net/karl_max/article/details/3977860 1. 并发原语: (1) Pid = spawn(Fun) %% 创建一个新的并发进程,用于 ...

  9. 第3章 简单的C程序设计——顺序程序设计

    3.1 顺序程序设计举例 例:有人用温度计测量出用华氏法表示的温度(如64F),今要求把它转换为一摄氏法表示的温度(如17.8C) 解题思路:问题的关键在于找到两者的转换公式.根据物理学知识,公式为c ...

随机推荐

  1. Javascript 笔记:原型和原型链

    一.函数对象和普通对象 凡是通过new Function()创建的都是函数对象,其它的都是普通对象.Function,Object,Array,Number,String,Boolean,Date是J ...

  2. zipfile

    zipfile是一个用于处理zip压缩格式的文件的模块, 主要会用到它的ZipFile类 import zipfile zipfile.is_zipfile('myzip.zip')) # 判断一个文 ...

  3. java核心技术(第十版卷一)笔记(纯干货!)

    这是我读过的第三本关于java基础的书.第一本<<java从入门到精通>>这本书让我灵识初开.第二本<<java敏捷开发>>这本书则是有一次被一位师傅批 ...

  4. 阿里云RDS数据库备份同步到自建库方法(SHELL脚本)

    一.背景: 由于阿里云RDS生产库每天都需要备份且拷贝到自建读库,而如果使用阿里云的自动拷贝到只读实例, 费用太高, 故采用自编写同步脚本方法实现. 二.前提: 1). 已开通阿里云RDS, 且开启定 ...

  5. laravel5.5框架中视图间如何共享数据?视图间共享数据的两种方法

    laravel框架中视图间共享数据有两种,一种是用视图门面share()方法实现,另一种是用视图门面composer() 方法实现,那么,两种方法的实现究竟是怎样的呢?让我们来看一看接下来的文章内容. ...

  6. antd Table 可伸缩列没有效果

    把antd 中的Table可伸缩示例代码,下载到自己的代码中发现,鼠标放到表格的边框上,并没有出现可伸缩鼠标样式,最后的解决方法是在css样式中添加下面的样式,就解决问题了. .react-resiz ...

  7. centos7.x下环境搭建(四)—redis安装

    redis介绍 redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下字符串.列表 ...

  8. excel中使用统计列中的值在其他列出现的次数

    excel中使用统计一列的中值在其他列出现的次数 =COUNTIFS($J$:$J$,K2) 解释下 $J$2 J列中的第二行到 $J$373 J列的373行  范围内 查找 k列的第二行的值 出现的 ...

  9. Python关于多继承

    大部分面向对象的编程语言(除了C++)都只支持单继承,而不支持多继承,为什么呢?因为多继承不仅增加编程复杂度,而且容易导致莫名其妙的错误. Python虽然语法上支持多继承,但是却不推荐使用多继承,而 ...

  10. P2995 [USACO10NOV]牛的照片(树状数组,逆序对)

    题目: P2995 [USACO10NOV]牛的照片Cow Photographs P4545 [USACO10NOV]奶牛的图片Cow Photographs SP7809 COWPIC - Cow ...