Skip to content

Instantly share code, notes, and snippets.

@nattybear
Last active November 23, 2020 14:11
Show Gist options
  • Save nattybear/f01f1d0e62490aaf2ab02b4ec32189f4 to your computer and use it in GitHub Desktop.
Save nattybear/f01f1d0e62490aaf2ab02b4ec32189f4 to your computer and use it in GitHub Desktop.
하스켈의 관습들

관습이란

프로그래밍 언어에서 관습이란 '지키지 않아도 문제는 없는 것'을 말한다. 문제는 없지만 그 언어를 사용하는 사람들끼리 '이렇게 하면 보기 좋겠다, 편하겠다'라는 어떤 전통 같은 것들이다.

관습이 아닌 것

한편 관습이 아닌 것은 '지키지 않으면 안 되는 것'을 말하는데 아래와 같은 것들이 있다.

  • 데이터 타입이나 클래스의 이름은 대문자로 시작해야 한다.
  • 함수는 소문자로 시작해야 한다.

비슷하지만 다른 것

같지는 않지만 서로 관련이 있는 것에는 원래 이름에 '를 붙인다. 예를 들어 아래와 같이 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 에서 따왔을 것이다.

대문 링크

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment