Erlang学习三


http://www.erlang.org/doc/getting_started/intro.html#id60368



变量:

每个变量在它的作用域内只能给定一个值

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">1> M = 5.
5
2> M = 6.
** exception error: no match of right hand side value 6
3> {X,Y} = {paris,{f,27}}.
{paris,{f,27}}
4> X.
paris
5> Y.
{f,27}
6> </span></span></span>

revert:

<span style="font-size:18px;"><span style="font-size:18px;">-module(tut).
-export([revert/1]).


revert([]) ->
	ok;

revert([Head | Rest]) ->
	revert(Rest,Head).


revert([],TemLs) ->
	TemLs;

revert([Head | Rest],TemLs) ->
	Tem = [Head | TemLs],
	revert(Rest,Tem).



25> tut:revert([1,2,3]).
[3,2|1]
26> </span></span>


把Head当做元素,导致Tem[2|1] 

<span style="font-size:18px;"><span style="font-size:18px;">-module(tut).
-export([revert/1]).


revert([]) ->
	ok;

revert(List) ->
	revert(List,[]).


revert([],TemLs) ->
	TemLs;

revert([Head | Rest],TemLs) ->
	Tem = [Head | TemLs],
	revert(Rest,Tem).


27> c(tut).
{ok,tut}
28> tut:revert([1,2,3]).
[3,2,1]
29> </span></span>


list中[ ] 和[Head | Rest]区别

<span style="font-size:18px;"><span style="font-size:18px;">-module(tut).
-export([revert/1]).



revert([Head | Rest]) ->
	1.



4> c(tut).
tut.erl:8: Warning: variable 'Head' is unused
tut.erl:8: Warning: variable 'Rest' is unused
{ok,tut}
5> tut:revert([]).
** exception error: no function clause matching tut:revert([]) (tut.erl, line 8)
6>
</span></span>


查找最大最小值:

<span style="font-size:18px;">-module(tut).
-export([findmaxandmin/1]).


findmaxandmin([Head | Rest]) ->
	findmaxandmin(Rest,Head,Head).



findmaxandmin([Head | Rest],Max,Min) ->
	if Head > Max ->
		TemMax = Head;
	true ->
		TemMax = Max
	end,
	if Head < Min ->
		TemMin = Head;
	true ->
		TemMin = Min
	end,
	findmaxandmin(Rest,TemMax,TemMin);


findmaxandmin([],Max,Min) ->
	{Max,Min}.



3> c(tut).
{ok,tut}
4> tut:findmaxandmin([1,2,3,2,1]).
{3,1}
5> </span>

if and case:

end之前没有分号

<span style="font-size:18px;">-module(tut).
-export([test/2]).

test(A,B) ->
	if
		A == 1 ->
			io:format("A == 1~n");
		B == 2 ->
			io:format("B == 2~n");
		A == 2,B == 3 ->
			io:format("A == 2,B == 3~n");
		A == 4;B == 5 ->
			io:format("A == 4;B == 5~n")
	end.



24> c(tut).
{ok,tut}
25> tut:test(2,2).
B == 2
ok
26> tut:test(2,4).
** exception error: no true branch found when evaluating an if expression
     in function  tut:test/2 (tut.erl, line 5)
27> tut:test(2,3).
A == 2,B == 3
ok
28> tut:test(4,5).
A == 4;B == 5
ok
29> </span>


<span style="font-size:18px;">-module(tut).
-export([convert/1]).


convert(Val) ->
	case Val of
		{cent,X} ->
			{inch,X / 2.54};
		{inch,Y} ->
			{cent,Y * 2.54}
	end.


31> c(tut).
{ok,tut}
32> tut:convert(1).
** exception error: no case clause matching 1
     in function  tut:convert/1 (tut.erl, line 6)
33> tut:convert({cent,2}).
{inch,0.7874015748031495}
34> tut:convert({inch,2}).
{cent,5.08}
35> </span>

built in functions (BIFs)

因某些原因把函数构造在Erlang虚拟机中,例如为了实现在Erlang中不可能的实现或不高效的功能。

BIFs可以直接用其函数名,但是,他们属于erlang模块,例如调用trunc(向下取整)等价于erlang:trunc.


<span style="font-size:18px;"></span><pre name="code" class="plain">34> 2004 rem 400.
4
35> 
36> trunc(5.5).537> round(5.5).638> length([a,b,2,3]).439> float(5).5.040> is_atom(H).* 1: variable 'H' is unbound41> is_atom(h).true42> is_atom("h").false43> is_atom({1,2}).false44> is_tuple({1,2}).true45> is_tuple([1,2]).false46> atom_to_list(hello)."hello"47> list_to_atom("hello47> ").'hello\n'48> list_to_atom("hello").hello49> integer_to_list(22)."22"50>
 



-module(tut).
-export([monthdays/2]).


monthdays(Year,Mon) ->
	Leap = if
				trunc(Year / 400) * 400 == Year ->
					leap;
				trunc(Year / 100) * 100 == Year ->
					not_leap;
				trunc(Year / 4) * 4 == Year ->
					leap;
				true ->
					not_leap
			end,

	case Mon of
		sep -> 30;
		apr -> 30;
		feb when Leap == leap -> 29;
		feb -> 28
	end.


2> c(tut).
{ok,tut}
3> tut:monthdays(2004,feb).
29
4> 


higher order functions(Funcs)

-module(tut).
-export([foreach/2,map/2]).


foreach(Fun,[First | Rest]) ->
	Fun(First),
	foreach(Fun,Rest);

foreach(Fun,[]) ->
	ok.


map(Fun,[First | Rest]) ->
	T= Fun(First),
	Tem = [T | map(Fun,Rest)],
	Tem;

map(Fun,[]) ->
	[].



4> Xf = fun(X) -> X * 2end.
#Fun<erl_eval.6.90072148>
5> Xf(3).
6
6> c(tut).

14> tut:map(Xf,[1,2,3]).
[2,4,6]


17> Fe = fun(X) -> io:format("~w",[X * 2])end.
#Fun<erl_eval.6.90072148>
18> tut:foreach(Fe,[1,2,3]).
246ok
21>


-module(tut).
-export([convertlist/1]).


convert({Name,{f,Temp}}) ->
	{Name,{c,trunc((Temp - 32)*5 / 9)}};


convert({Name,{c,Temp}}) ->
	{Name,{c,Temp}}.


convertlist(List) ->
	Newls = lists:map(fun convert/1,List),
	lists:sort(fun({_,{c,Temp1}},{_,{c,Temp2}}) ->
					Temp1 < Temp2 end,Newls).


21> c(tut).
{ok,tut}
22> tut:convertlist([{moscow,{c,-10}},{bj,{f,2}}]).
[{bj,{c,-16}},{moscow,{c,-10}}]
23> 








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值