Erlang 프로그램 설계 학습 노트(二) 모듈과 함수

5973 단어

Erlang 프로그램 설계 학습 노트(二) 모듈과 함수


모듈과 함수


모듈은 Erlang의 기본 코드 유닛이며, 모듈은 확장자 에 저장됩니다.erl 파일에서 컴파일된 모듈은.확장자로 beam
먼저 모듈의 코드geometry를 보십시오.erl
%% @author DaDa
%% @doc @todo Add description to geometry.


-module(geometry).

%% ====================================================================
%% API functions
%% ====================================================================
-export([test/0,area/1]).

test()->
	6 = area({rectangle,2,3}),
	4 = area({square,2}),
	test_ok.

area({rectangle , Width , Height}) -> Width * Height;
area({square , Side }) -> Side * Side.



%% ====================================================================
%% Internal functions
%% ====================================================================

-moudle(geometry).
모듈 성명: 성명 안의 모듈 이름은 이 모듈을 저장하는 주 파일 이름과 같아야 합니다
-export([tesr/0 , area/1]).
성명 내보내기: Name/N은 함수의 메타로 불리는 N개의 매개 변수가 있는 함수Name
수(arity).export 매개 변수는 Name/N 항목으로 구성된 목록입니다.그러므로 -export
매개 변수가 있는 함수area입니다. 이 모듈 밖에서 호출할 수 있습니다.
자구:area 함수에는 두 개의 자구가 있는데, 자구는 고정된 순서가 없고, 함수를 호출할 때 첫 번째 호출 매개 변수와 일치한다.
부착된 자구가 실행되기 시작하다
모듈 하나 더 볼게요.
%% @author DaDa
%% @doc @todo Add description to shop.


-module(shop).

%% ====================================================================
%% API functions
%% ====================================================================


-export([cost/1,total/1]).

%%         
cost(oranges) -> 5;
cost(newspaper)->8;
cost(pears) -> 2;
cost(milk) -> 9;
cost(apples) -> 7.

%%      
total([{What,N}|T])-> cost(What) * N + total(T);
total([])->0.

%% ====================================================================
%% Internal functions
%% ====================================================================

함수가 목록을 옮겨다니다
total/1 함수는 전달된 목록에 있는 모든 상품의 총 가격을 계산하는 데 사용됩니다
예를 들어 shop::total([{pears,6},{milk,3}]).
1: cost(pears) * 6 + total([{milk,3}])
2:12+cost(milk)*3 + total[]
3:12+27+0;
4:39
fun 기본 추상 단원
Erlang은 함수 프로그래밍 언어입니다.또한 함수식 프로그래밍 언어는 함수가 다른 함수의 매개 변수로 사용할 수도 있고 함수를 되돌릴 수도 있음을 나타낸다.다른 함수를 조작하는 함수는 고급 함수(higher-order function)라고 하고, Erlang에서 함수를 대표하는 데이터 형식은fun이라고 한다.
함수를 변수에 직접 할당할 수 있습니다
1> MyAdd = fun(X , Y)->X + Y end.
#Fun<erl_eval.12.80484245>
2> MyAdd(1,222).
223

fun을 매개 변수로 하는 함수
표준 라이브러리의lists 모듈에서fun을 매개 변수로 하는 함수를 내보냅니다.이들 중 가장 유용한 것은lists:map(F, L)이다.이 함수는 목록 L의 각 요소에 fun F를 적용하여 생성된 목록을 반환합니다.
1> L = [1,2,3,4].
[1,2,3,4]
2> MyDouble = fun(X)->2 * X end.
#Fun<erl_eval.6.80484245>      
3> lists:map(MyDouble,L).
[2,4,6,8]
4> 

fun 함수 반환
7> Mult = fun(Times) ->(fun(X)->X * Times end)end.
#Fun<erl_eval.6.80484245>
8> Mult(3).
#Fun<erl_eval.6.80484245>
9> Triple = Mult(3).
#Fun<erl_eval.6.80484245>
10> Triple(2).
6
11> Double = Mult(2).
#Fun<erl_eval.6.80484245>
12> Double(23).
46
13> 

여기서 Double과 Triple이fun의 함수에 할당된 대상을 가장 잘 되돌려줍니다. 즉, Double과 Triple은 각각 두 함수Mult(2)와Mult(3)입니다.
Mult(2) 함수는 전달된 숫자를 Times에 곱한다
목록 유도
[F(X)||| X <-L] 태그는 "F(X)로 구성된 목록(X는 목록 L에서 추출)"을 의미합니다.따라서 [2*X||| X <-L]은 "2*X로 구성된 목록(X는 목록 L에서 추출)"이라는 뜻이다.
1> L = [1,2,3,4,5,6].
[1,2,3,4,5,6]
2> lists:map(fun(X)->X * 2 end , L).
[2,4,6,8,10,12]
3> [X*2||X<-L].
[2,4,6,8,10,12]
4> 

내장 함수
list_2_tuple/1 목록을 모듈로 변환
time/0은 {시,분,초} 형식으로 현재 시간을 되돌려줍니다.
세관
관문(guard)은 패턴이 일치하는 위력을 증가시키는 구조이다.관문을 사용하면 어떤 패턴의 변수에 대해 간단한 테스트와 비교를 수행할 수 있다
-module('max').


-export([max/2]).

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

true 관문
원자true는'오는 사람은 거절하지 않는다'는 관문으로 여겨져if표현식의 마지막에 놓을 수 있다
관문 판단 함수
함수.
의향
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의 노드를 작성합니다.
round(X)
X를 정수로 변환하려면 X가 숫자여야 합니다.
self()
현재 프로세스의 프로세스 식별자
size(X)
X의 크기, 그것은 하나의 원조 또는 이진형이 될 수 있다
trunc(X)
X를 소수부에서 떼어내고, X는 숫자여야 한다
tl(X)
목록 X 의 목록 끝
tuple_size(T)
모듈 T 크기
is_atom(X)
X는 원자이다
is_binary(X)
X는 2진법이다
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 크기의 레코드입니다.
case 및 if 표현식
case 문법
case Exoressuib of 
Pattern1 [when Guard1] -> Expr_seq1;
Pattern1 [when Guard1] -> Expr_seq1;
...
end
case의 실행 과정은 다음과 같습니다. 우선, Expression이 실행되고, 값이 Value라고 가정합니다.그런 다음 Value가 돌아가며
Pattern1(선택적 관문 Guard1 포함), Pattern2 등의 패턴과 일치할 때까지 일치합니다.일단 발견하면
일치하면 상응하는 표현식 서열이 실행되고 표현식 서열이 실행된 결과는case 표현식의 값이다.하면, 만약, 만약...
식이 일치하지 않으면 이상 오류가 발생합니다 (exception).
if 구문
if
Guard1 -> 
Expr_seq1;
Guard2 -> 
Expr_seq2;
...
end
먼저 Guard 1을 실행합니다.만약 얻은 값이true라면if의 값은 실행 표현식입니다
시퀀스 Exprseq1에서 얻은 값.Guard1이 성공하지 못하면 Guard2를 실행하여 어떤 관문까지 유추합니다
성공할 때까지만약 표현식은 최소한 하나의 관문의 실행 결과가true이어야 합니다. 그렇지 않으면 이상한 오류가 발생할 수 있습니다.
많은 경우if표현식의 마지막 관문은 원자true로 다른 관문이 실패할 때 표현식의 마지막 부분이 실행될 수 있도록 합니다

좋은 웹페이지 즐겨찾기