8. 중위 연산자

 
토, 2006-08-19 00:52 — 귤
Haskell은 무조건 왼쪽에서 오른쪽으로 처리한다. 그 예외가 +, - 같은 중위연산자(infix)이다. 이것도 일종의 문법 설탕(syntactic sugar)이랄 수 있다. 아무래도 + 1 2라고 쓰는 것보다야 1 + 2가 더 자연스러우니까 말이다. 대부분 언어에서 중위연산자는 언어 자체에 정의가 되어있지만, Haskell에서는 프로그래머가 정의할 수 있다. 다만 함수 이름에 다음 기호 중 하나는 포함되어 있어야 한다.
! # $ % & * + . / < = > ? @ \ ^ | - ~
수학에서 보통 +는 *보다 늦게 계산한다. 이를 우선 순위라고 한다. 그리고 똑같은 +가 두 개 이상 있으면 왼쪽부터 계산한다. 이것은 결합 순서라고 한다. Haskell에서 함수는 기본적으로는 우선 순위가 9이고 결합 순서는 왼쪽부터지만 중위연산자는 이를 지정해줄 수 있다.
infix 3 :+: -- 우선순위 3, 결합 순서 없음 infixl 5 :* -- 우선순위 5, 왼쪽부터 결합: infixr 7 :^: -- 우선순위 7, 오른쪽부터 결합
아래 표는 Haskell 표준함수 중에서 중위연산자들의 우선순위와 결합순서를 정리한 것이다.
 
 
순서
왼쪽부터
없음
오른쪽부터
8
**, ^, ^^
6
:+
5
\\
4
/=, <, <=, ==>, >=, `elem`, `notElem`
:,++
3
&&
2
||
0
$, `seq`
중위연산자를 다른 함수처럼 취급해야할 때가 있다. foldl 함수처럼 함수를 매개변수로 받는 함수에 넘겨 줄 때 그렇다. 이때 중위연산자의 앞뒤에 괄호를 붙여주면 보통 다른 함수들과 똑같이 취급한다.
(+) 1 2 ⇒ 1 + 2
반대로 함수를 중위연산자로 취급하고 싶으면 앞뒤에 역따옴표(~표 키에 있는 `)를 앞뒤에 붙여준다. elem 함수는 어떤 값이 리스트 안에 있는 지 없는 지 확인해주는 함수인데 영어의 "A is an element of B"라는 표현에서 따왔기 때문에 중위연산자로 많이 쓴다.
2 `elem` [1,2,3] ⇒ elem 2 [1,2,3]
때로는 오른쪽에서 왼쪽으로 계산해나가야할 경우도 있다. 먼저 계산해야할 부분을 괄호쳐주면 그만이지만 중위연산자 .을 이용해 합성함수를 만드는 방법도 있다.
f . g x ⇒ f ( g x )
그 외에 자주 쓰이는 중위연산자들은 다음과 같다.
 
 
자주 쓰는 연산자
연산자
역할
리스트에서 n번째 값을 얻을 때 쓴다
두 리스트를 연결할 때 쓴다.
논리곱(and)을 한다
논리합(or)을 한다.
"왼쪽과 오른쪽 값이 같다"
"왼쪽과 오른쪽 값이 다르다"
"왼쪽 값이 오른쪽 값보다 크다"
"왼쪽 값이 오른쪽 값보다 크거나 같다"
"왼쪽 값이 오른쪽 값보다 작다"
"왼쪽 값이 오른쪽 값보다 작거나 같다"
 
아래는 !!와 ++의 사용례이다.
[4,5,6] !! 0 ⇒ 4 [4,5,6] !! 1 ⇒ 5 [4,5,6] !! 2 ⇒ 6
[1,2] ++ [3,4] ⇒ [1,2,3,4]