ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Erlang学习笔记二

2021-06-12 17:34:46  阅读:197  来源: 互联网

标签:acc evens odds 笔记 学习 Evens Erlang todo Odds


列表推导式

Buy = [{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}].

1	->[{Name,2*Number}||{Name,Number} <- Buy].
<- [{oranges,8},{newspaper,2},{apples,20},{pears,12},{milk,6}]
2	->[{2*Number}||{Name,Number} <- Buy].
<-[{8},{2},{20},{12},{6}]

利用shell 编写第一条的时候,会把每一个商品的金额乘以2,
然后利用第二条发送的时候 发现只会返回乘以2,因此可以看出控制输出内容在于列表推导式的第一条元组

解读  
	从右到左的顺序,首先将Buy 放到列表推导式中,然后分值变量,通过|| 类似与运维的管道符。将数值进行处理
	而在erlang中也说明了左边第一个元组可以叫做构造器(construcuor)

lib_misc.erl

-module(lib_misc).
-export( [qsort/1] ). 

qsort([] ) -> [];

qsort([Pivot|T]) ->
    qsort([X || X <- T, X <    Pivot])
    ++ [Pivot] ++
    qsort ([X || X  <- T,X >= Pivot]).
	
->C = [23,6,2,9,27,400,78,45,61,82,14].
<-[23,6,2,9,27,400,78,45,61,82,14].
->L = [23,123,54,123,78,123].
<-[23,54,78,123,123,123].
解读
	执行qsort的时候将C 变成头与尾,然后在向下执行 第一个表达式的意思就是将头与每个数值新型比较,每个数值 <头部的将他存储起来 , 然后 将 上下两个列表相加返回 然后在向下执行比较比他大或者等于他的

内置函数(BIF)

list_to_tuple
	将列表转换成元组
time()
	时分秒返回时间

归集器

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

=>  lib_misc:odds_and_evensl([1,2,3,4,5,6]).
<- {[1,3,5],[2,4,6]}

odds_and_evens2(L) ->
    odds_and_evens_acc(L,[],[]).

odds_and_evens_acc([H|T],Odds,Evens) ->
    case (H rem 2) of 
        1 -> odds_and_evens_acc(T,[H|Odds],Evens);
        0 -> odds_and_evens_acc(T,Odds,[H|Evens])
    end;

odds_and_evens_acc([],Odds,Evens)  ->

    {Odds,Evens}.
    
-> lib_misc:odds_and_evens2([1,2,3,4,5,6])
<- {[5,3,1],[6,4,2]}
解读
	第二个例子有点绕,因为erlang没有像python里面的for循环,所以所有的数据就像加工一样买一层一层的剥
	首先 调用了一下当前第一个函数 也就是odds_and_ecens2,然后里面执行了下面的两个函数,L值的情况下
	分出头和尾,然后将两个空列表也进行了传输, 第一次case 用头除去当前的2判断是否是1或者0,
	如果是1的话那么,那么继续调用这个函数,并且将刚才判断的1或者0的放入头,也就是反转了列表,继续剥
	等到为空的时候则 将分好的两个列表打包成元组返回

记录与映射组(map)

其实就相当于Python的字典
可以保存到一个文件里面 其拓展名为.hrl
-record(todo,{status=reminder,who=joe,text}).
	创建了一条字典,名字是todo
rr("当前创建拓展名的文件")
	记录到shell里面

#todo{}
	相当于创建实例吧 在Python里面
->X1 = #todo{status=urgent,who=joe,text="11"}.
<-#todo{status = urgent,who = joe,text = "11"}
->X2 = X1#todo{status=1}
<-#todo{status = 1,who = joe,text = "11"}

语法 #todo{key1=Val1, ..., keyN=ValN} 用于创建一个类型为 todo 的新纪录。所有的键都是原子,而且必须与记录定义里所用的一致。如果省略
了一个键,系统就会用记录定义里的值作为该键的默认值。
在第4行复制了一个现有的记录。语法 X1#todo{status=done} 的意思是创建一个 X1 的副本
(类型必须是 todo ),并修改字段 status 的值为 done 。请记住,这么做生成的是原始记录的一个
副本,原始记录没有变化
提取
->#todo{who=W,text=Txt} = X2.
<-#todo{status = 1,who = joe,text = "11"}
->W
<-joe
->Txt
<-11
->X2#todo.text
<- 11

在函数里面写入

clear_status(#todo{status=S,who=W}=R) ->
	%% 在函数内部,S和W绑定了记录里面的字段值 R是整个记录

do_something(X) when is_record(X,todo) ->
	 block code.....
	这个子句会在 X 是 todo 类型的记录时匹配成功。

映射组

即,没有原子作为名字的一组字典,直接就变成字典了 与上面记录不同的就是记录就跟Python一样有变量名指向这个字典
->F2 = #{b => 2, a => 1}.
<-#{a => 1,b => 2}
->F1 = F2.
<-#{a => 1,b => 2}
->F3 = F1#{c => xx}.
<-#{a => 1,b => 2,c => xx}
-> F1. 
<-#{a => 1,b => 2}
提取
->Henry8 = #{class => king,born => 1491,died => 1574}.
<-#{born => 1491,class => king,died => 1574}
->#{ born := B} = Henry8.
<-#{born => 1491,class => king,died => 1574}
->B.
<-1941

标签:acc,evens,odds,笔记,学习,Evens,Erlang,todo,Odds
来源: https://blog.csdn.net/JiuWeiYaoHo/article/details/117815076

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有