erlang에 사실 대입연산자는 존재하지 않습니다. 대신 패턴매칭이 존재합니다.
일반적으로 변수의 역활을 하는 아톰은 그 시작을 대문자로하여 일반적인 아톰과 구분합니다.
패턴매칭에 좌변에 나타난 변수명에 대해서 우변의 값들을 바인딩합니다. 혹은 좌변의 나타난 변수명이 이미 바인딩된 경우에는 에러입니다.
즉, 다음과 같이 간단한 예를 생각해볼 수 있습니다.
<code>
> A = 1. %% 1을 A에 매칭. A가 바인드되어 있지 않다면 A에 1을 바인드.
...
> A = 2. %% A은 이미 바인드 되어있으므로 에러!
...
</code>
패턴식의 우변은 반드시 상수일 필요가 없습니다. 또한 좌변도 반드시 변수명일 필요가 없습니다. 자연스럽게 서로 말그대로 패턴이 일치하는 형식을 취하면 이를 적용할 수 있습니다.
<code>
> L = [1,2,3].
...
> [1, C, _] = L.
...
> C.
2
...
</code>
위의 식들에서 알 수 있듯이 좌변에 나타난 상수는 우변의 값에 대한 매칭을 시도할 것이고, 좌변에는 변수가 오거나 리스트, 튜플과 같은 복합적인 자료형이 올 수 있습니다. 또한 여기서 주목할 부분은 '_'인데 이는 애스터리크로서 다른 어떠한 값 하나와 일치하는 패턴이며 특별히 바인딩을 하거나 하지 않습니다.
바이너리나 레코드와 같은 다른 복합된 자료형에 대한 특별한 패턴매칭이 따로 존재하지만 리스트나 튜플과 유사하고 이들에 대해서도 설명이 필요하기 때문에 각각을 설명할때로 미루고 여기서는 튜플과 리스트의 매칭에만 집중하겠습니다.
* 튜플의 패턴매칭 : 특별히 어려울것 없이 일반적인 튜플식과 같이 사용하는데 중첩된 것들도 표현이 가능하고 중첩된 하나의 인자를 하나의 바인딩으로 처리할수도 있습니다.
<code>
> T = {1,2,{3,4,5}}.
...
> {X, _, Y} = T.
...
> X.
1
> Y.
{3,4,5}
...
</code>
* 리스트의 패턴매칭 : 튜플과 유사하지만, head와 tail의 경우 특별한 규칙이 존재합니다. lisp이래로의 전통으로 리스트의 첫번째 요소는 head라 부르고, 나머지 부분을 tail이라는 리스트로 처리합니다.
<code>
> M = [apples, oranges, pears].
...
> [Hd | Tl] = M.
...
> Hd.
apples
> Tl.
[oranges, pears]
...
</code>
위에서 보듯이 리스트에 대해서 패턴 매칭을 할때 '|'의 좌측은 head, 우측은 tail임을 알 수 있습니다.
패턴매칭은 함수치환이나 가드와 같은 일반적인 문법에서 광범위하게 사용되며 declarative한 함수형언어의 표현을 이루는 근간이됩니다.