Erlang学习笔记二

列表推导式

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
上一篇:直线段-两点线性插值及可视化


下一篇:杨辉三角(java)