Y 분 에 에 랑 배우 기.
9160 단어 함수 식 프로 그래 밍병발 하 다입문 하 다erlang
% 百分比符号标明注释的开始。
%% 两个符号通常用于注释函数。
%%% 三个符号通常用于注释模块。
Erlang 에 서 는 세 가지 문장 부 호 를 사용 합 니 다.
,
분리 함수 호출 중의 매개 변수, 데이터 구축 과 모델..
(뒷 굽 빈 칸) 분리 함수 와 셸 의 표현 식.;
구분자.다음 환경 에서 사용 하 는 문장: 함수 정의 와 case
, if
, try..catch
, receive
표현 식.1. 변수 와 패턴 일치
Num = 42. % 变量必须以大写字母开头。
Erlang 의 변 수 는 한 번 만 할당 할 수 있 습 니 다.변수 에 다른 값 을 부여 하면 오류 가 발생 할 수 있 습 니 다:
Num = 43. % ** exception error: no match of right hand side value 43
대부분의 언어
=
는 할당 문 구 를 나타 내 고 Erlang 에 서 는 패턴 이 일치 하 는 것 을 나타 낸다.Lhs = Rhs
사실은 오른쪽 (Rhs) 을 연산 하여 결 과 를 왼쪽 모드 와 일치 시 키 는 것 을 의미한다.Num = 7 * 6.
부동 소수점
Pi = 3.14159.
Atoms 는 비 숫자의 상수 를 나타 내 는 데 쓰 인 다.Atom 은 알파벳, 숫자,
_
과 @
를 소문 자로 시작한다.Hello = hello.
OtherNode = example@node.
Atom 에 특수 문자 가 포함 되 어 있 으 면 작은 따옴표 로 묶 을 수 있 습 니 다.
AtomWithSpace = 'some atom with space'.
Erlang 의 원 조 는 C 와 유사 한 struct 입 니 다.
Point = {point, 10, 45}.
패턴 일치 연산 자
=
를 사용 하여 원 그룹의 값 을 가 져 옵 니 다.{point, X, Y} = Point. % X = 10, Y = 45
우 리 는
_
우리 가 관심 이 없 는 변 수 를 저장 할 수 있다._
익명 변수 라 고 불 린 다.다른 변수 와 달리 같은 모드 의 여러 개 _
변 수 는 같은 값 에 연결 할 필요 가 없습니다.Person = {person, {name, {first, joe}, {last, armstrong}}, {footsize, 42}}.
{_, {_, {_, Who}, _}, _} = Person. % Who = joe
목록 은 괄호 를 사용 하고 요소 간 에는 쉼표 로 구분 합 니 다.목록 의 요 소 는 임의의 형식 일 수 있 습 니 다.목록 의 첫 번 째 요 소 는 목록 의 head 라 고 하고 나머지 요 소 는 목록 의 tail 이 라 고 합 니 다.
ThingsToBuy = [{apples, 10}, {pears, 6}, {milk, 3}].
T
이 하나의 목록 이 라면 [H|T]
역시 하나의 목록 입 니 다. head 는 H
이 고, tail 은 T
입 니 다. |
목록 을 구분 하 는 head 와 tail. []
은 빈 목록 입 니 다.목록 에 있 는 요 소 를 추출 하기 위해 서 패턴 일치 동작 을 사용 할 수 있 습 니 다.만약 에 우리 가 비어 있 지 않 은 목록 L
이 있다 면 [X|Y] = L
은 L 의 head 에서 X, tail 에서 Y (X, Y 는 정의 되 지 않 은 변수) 를 추출 합 니 다.[FirstThing|OtherThingsToBuy] = ThingsToBuy.
% FirstThing = {apples, 10}
% OtherThingsToBuy = {pears, 6}, {milk, 3}
Erlang 의 문자열 은 정수 로 구 성 된 배열 입 니 다.문자열 은 더 블 따옴표 를 사용 합 니 다.
Name = "Hello".
[72, 101, 108, 108, 111] = "Hello".
2. 순차 프로 그래 밍
Module 은 Erlang 코드 의 기본 단위 입 니 다.우리 가 작성 한 모든 함 수 는 module 에 저장 되 어 있다.모듈 은 접미사
.erl
파일 에 저 장 됩 니 다.Module 은 사전에 컴 파일 해 야 합 니 다.컴 파일 된 module 은 .beam
로 끝 납 니 다.-module(geometry).
-export([area/1]). % module 对外暴露的函数列表
area
함 수 는 두 개의 문장 을 포함 하고 문장 간 에 분점 으로 구분 된다.마지막 문장 은 마침표 에 줄 을 바 꾸 어 끝난다.각 문장 은 머리 와 몸 두 부문 으로 구성 된다.머리 에는 함수 이름과 괄호 로 묶 은 패턴 이 포함 되 어 있 으 며, 몸 에는 일련의 표현 식 이 포함 되 어 있 으 며, 머리 패턴 이 호출 된 매개 변수 와 일치 하면 이 표현 식 들 은 연산 된다.패턴 매 칭 은 정 의 된 순서대로 진 행 됩 니 다.area({rectangle, Width, Ht}) -> Width * Ht;
area({circle, R}) -> 3.14159 * R * R.
파일 을 geometry. erl 로 컴 파일 합 니 다.
c(geometry). % {ok,geometry}
함 수 를 호출 할 때 는 module 이름과 함수 명 을 사용 해 야 합 니 다.
geometry:area({rectangle, 10, 5}). % 50
geometry:area({circle, 1.4}). % 6.15752
Erlang 에 서 는 같은 모듈 에서 매개 변수 수가 다 르 고 이름 이 같은 함 수 는 완전히 다른 함수 입 니 다.
-module(lib_misc).
-export([sum/1]). % 对外暴露的`sum`函数接受一个参数:由整数组成的列表。
sum(L) -> sum(L, 0).
sum([], N) -> N;
sum([H|T], N) -> sum(T, H+N).
fun 은 익명 함수 입 니 다.이름 은 없 지만 변 수 를 할당 할 수 있 습 니 다.
Double = fun(X) -> 2*X end. % `Double` 指向匿名函数 #Fun
Double(2). % 4
fun 는 함수 의 매개 변수 와 반환 값 으로 사용 할 수 있 습 니 다.
Mult = fun(Times) -> ( fun(X) -> X * Times end ) end.
Triple = Mult(3).
Triple(5). % 15
목록 분석 은 목록 을 만 드 는 표현 식 (fun, map 또는 filter 를 사용 하지 않 음) 입 니 다.
[F(X) || X 表示 "由 F(X)
로 구 성 된 목록 중 X
은 목록 L
에서 추출 합 니 다.L = [1,2,3,4,5].
[2*X || X
목록 분석 은 생 성 기 를 사용 할 수도 있 고 필 터 를 사용 할 수도 있 습 니 다. 필 터 는 목록 의 일부분 을 선별 하 는 데 사 용 됩 니 다.EvenNumbers = [N || N
Guard 는 증강 모드 에 맞 는 구조 입 니 다.Guard 는 간단 한 테스트 와 비교 에 사용 할 수 있 습 니 다.Guard 는 함수 가 정의 하 는 머리 에 사용 할 수 있 습 니 다. when
키워드 로 시작 하거나 표현 식 을 사용 할 수 있 는 다른 곳 입 니 다.max(X, Y) when X > Y -> X;
max(X, Y) -> Y.
guard 는 일련의 guard 표현 식 으로 구성 되 며, 이 표현 식 들 은 쉼표 로 구 분 됩 니 다.GuardExpr1, GuardExpr2, ..., GuardExprN
은 진실 이 고 모든 guard 표현 식 이 진실 일 때 만 가능 합 니 다.is_cat(A) when is_atom(A), A =:= cat -> true;
is_cat(A) -> false.
is_dog(A) when is_atom(A), A =:= dog -> true;
is_dog(A) -> false.
guard 시퀀스 G1; G2; ...; Gn
는 진실 이 며, 그 중 임의의 guard 표현 식 만 진실 이 라 고 생각 합 니 다.% one of the guards `G1, G2, ...` evaluates to true.
is_pet(A) when is_dog(A); is_cat(A) -> true;
is_pet(A) -> false.
Record 는 원 그룹의 요 소 를 특정한 이름 으로 연결 할 수 있 습 니 다.Record 정 의 는 Erlang 소스 코드 에 포함 할 수도 있 고 접미사 .hrl
파일 에 넣 을 수도 있 습 니 다 (Erlang 소스 코드 에 이 파일 들 을 포함 합 니 다).-record(todo, {
status = reminder, % Default value
who = joe,
text
}).
어떤 record 를 정의 하기 전에 셸 에서 record 의 정 의 를 가 져 와 야 합 니 다.우 리 는 셸 함수 rr
(read records 의 약칭) 를 사용 할 수 있다.rr("records.hrl"). % [todo]
record 를 만 들 고 업데이트 합 니 다.X = #todo{}.
% #todo{status = reminder, who = joe, text = undefined}
X1 = #todo{status = urgent, text = "Fix errata in book"}.
% #todo{status = urgent, who = joe, text = "Fix errata in book"}
X2 = X1#todo{status = done}.
% #todo{status = done,who = joe,text = "Fix errata in book"}
case
표현 식 입 니 다. filter
목록 L
의 모든 만족 P(x)
이 진짜 요소 X
로 구 성 된 목록 을 되 돌려 줍 니 다.filter(P, [H|T]) ->
case P(H) of
true -> [H|filter(P, T)];
false -> filter(P, T)
end;
filter(P, []) -> [].
filter(fun(X) -> X rem 2 == 0 end, [1, 2, 3, 4]). % [2, 4]
if
표현 식.max(X, Y) ->
if
X > Y -> X;
X < Y -> Y;
true -> nil;
end.
경고: if
표현 식 에 최소한 하나의 guard 가 있 습 니 다. 그렇지 않 으 면 이상 이 발생 합 니 다.
3. 이상
내부 오류 나 현식 호출 이 발생 하면 이상 이 발생 합 니 다. 현식 호출 은 throw(Exception)
, exit(Exception)
, erlang:error(Exception)
를 포함 합 니 다.generate_exception(1) -> a;
generate_exception(2) -> throw(a);
generate_exception(3) -> exit(a);
generate_exception(4) -> {'EXIT', a};
generate_exception(5) -> erlang:error(a).
Erlang 은 이상 을 포착 하 는 두 가지 방법 이 있 습 니 다. 하 나 는 try...catch
표현 식 에 소 포 를 호출 하 는 것 입 니 다.catcher(N) ->
try generate_exception(N) of
Val -> {N, normal, Val}
catch
throw:X -> {N, caught, thrown, X};
exit:X -> {N, caught, exited, X};
error:X -> {N, caught, error, X}
end.
다른 방법 은 소 포 를 catch
표현 식 에 호출 하 는 것 입 니 다. 이 때 이상 은 잘못된 원 그룹 으로 전 환 됩 니 다.catcher(N) -> catch generate_exception(N).
4. 병발
Erlang 은 actor 병렬 모델 에 의존 합 니 다. Erlang 에서 병렬 프로그램 을 작성 하 는 세 가지 요소: 프로 세 스 를 만 들 고 메 시 지 를 보 내 며 메 시 지 를 받 습 니 다.
새로운 프로 세 스 를 시작 합 니 다. spawn
함 수 를 매개 변수 로 받 습 니 다.F = fun() -> 2 + 2 end. % #Fun
spawn(F). % <0.44.0>
spawn
함수 가 pid (프로 세 스 식별 자) 를 되 돌려 줍 니 다. pid 를 사용 하여 프로 세 스에 메 시 지 를 보 낼 수 있 습 니 다. !
연산 자 를 사용 하여 메 시 지 를 보 낼 수 있 습 니 다. 프로 세 스 내 에서 메 시 지 를 받 아야 합 니 다. receive
메커니즘 을 사용 해 야 합 니 다.-module(caculateGeometry).
-compile(export_all).
caculateAera() ->
receive
{rectangle, W, H} ->
W * H;
{circle, R} ->
3.14 * R * R;
_ ->
io:format("We can only caculate area of rectangles or circles.")
end.
이 모듈 을 컴 파일 하여 셸 에 프로 세 스 를 만 들 고 caculateArea
함 수 를 실행 합 니 다.c(caculateGeometry).
CaculateAera = spawn(caculateGeometry, caculateAera, []).
CaculateAera ! {circle, 2}. % 12.56000000000000049738
셸 도 프로 세 스 (process) 입 니 다. self
를 사용 하여 현재 pid 를 가 져 올 수 있 습 니 다.self(). % <0.41.0>
References "Learn You Some Erlang for great good!" "Programming Erlang: Software for a Concurrent World"by Joe Armstrong Erlang/OTP Reference Documentation Erlang - Programming Rules and Conventions
원문 Learn X in Y minutes, where X = Erlang by contributors 번역 SegmentFault 허가 CC - BY - SA
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 8 함수 식 인터페이스 -- Supplier
JAVA 8 함수 인터페이스 - Supplier
JDK 8 부터 자바 는 함수 식 프로 그래 밍 을 지원 하고 JDK 도 자주 사용 하 는 함수 식 인 터 페 이 스 를 제공 합 니 다.
이 편 은 Supplier ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.