프로그래밍 언어에서 관습이란 '지키지 않아도 문제는 없는 것'을 말한다. 문제는 없지만 그 언어를 사용하는 사람들끼리 '이렇게 하면 보기 좋겠다, 편하겠다'라는 어떤 전통 같은 것들이다.
한편 관습이 아닌 것은 '지키지 않으면 안 되는 것'을 말하는데 아래와 같은 것들이 있다.
- 데이터 타입이나 클래스의 이름은 대문자로 시작해야 한다.
- 함수는 소문자로 시작해야 한다.
같지는 않지만 서로 관련이 있는 것에는 원래 이름에 '
를 붙인다. 예를 들어 아래와 같이 n
이라는 이름이 있을 때 비슷한 이름을 만들고 싶다면 원래 이름에 '
를 붙여서 n'
이라고 한다.
doubleAndInc n = n + n'
where n' = n + 1
'
은 영어로 prime 이라고 발음한다.
리스트를 패턴 매칭 할 때 원소 하나는 영어 소문자 한글자로 표현하고 나머지 원소들은 그 영어 소문자 한글자에 s
를 붙여서 여러개임을 표현한다.
x:xs
필요 없는 것을 표현할 때는 _
를 사용한다.
영어로는 underscore 라고 발음한다. 언더바가 아니다. 하스켈에서는 hole 이라고 말하는 것 같다.
아래 함수 head
에서 필요한 것은 x
이고 xs
는 필요 없기 때문에 보통 _
로 쓴다.
head :: [a] -> a
head (x:xs) = x -- 이렇게 쓰기보다는
head (x:_) = x -- 이렇게 쓴다.
프로그래밍 언어에서 함수나 변수의 이름을 짓는 방법에는 크게 아래와 같은 방법들이 있다.
- 낙타
- 케밥
- 뱀
- 파스칼
하스켈은 함수와 변수는 낙타 방법을 사용하고 데이터 타입과 클래스 이름에는 파스칼 방식을 사용한다.
이건 하스켈만 그런 것은 아니고 다른 프로그래밍 언어에서도 비슷할 것 같다.
정수와 비슷한 숫자를 표현할 때는 변수 이름에 아래와 같이 영어 소문자 n
부터 차례대로 사용한다.
inc :: Int -> Int
inc n = n + 1
add :: Int -> Int -> Int
add n m = n + m
아마도 자연수의 영어 단어가 natural number라서 그런 것 같다.
인자가 함수일 경우에는 아래와 같이 영어 소문자 f
부터 차례대로 사용한다.
map :: (a -> b) -> [a] -> [b]
map f (x:xs) = f x : map f xs
함수의 영어 단어인 function 에서 따왔을 것이다.