이제 간단한 함수를 만들어보자.
함수는 호출될 때와 유사한 방식으로 정의된다. 함수 이름에 이어 공백 다음에 파라메터가 나온다. 하지만 함수를 정의할 때는 = 다음에 해당 함수가 수행할 기능이 나온다. 아래와 같이 작성한 후 baby.hs 등으로 저장하자. 해당 파일이 저장된 경로로 이동하여, :l baby 라고 치면 해당 스크립트가 로딩된다.
baby.hs
1 | doubleMe x = x + x | cs |
1 2 3 4 5 6 7 8 9 | (blackbriar) root@gcloudx:~/blackbriar/blackbriar/lab/miran# ghci GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help Prelude> :l baby.hs [1 of 1] Compiling Main ( baby.hs, interpreted ) Ok, modules loaded: Main. *Main> doubleMe 9 18 *Main> doubleMe 8.3 16.6 | cs |
또 다른 함수 doubleUS 를 만들어보자.
1 | doubleUs x y = x*2 + y*2 | cs |
doubleMe와 같은 파일 baby.hs에 위의 라인을 추가한다. 파일을 저장한 후 reload 하여 수행한다.
1 2 3 4 5 6 7 8 9 | *Main> :reload [1 of 1] Compiling Main ( baby.hs, interpreted ) Ok, modules loaded: Main. *Main> doubleUs 4 9 26 *Main> doubleUs 2.3 34.2 73.0 *Main> doubleUs 28 88 + doubleMe 123 478 | cs |
다음과 같이 doubleMe 를 표현할 수도 있다. 하스켈의 경우 순서는 무관하므로 doubleMe 가 반드시 doubleUs 앞에 와야할 필요는 없다.
1 | doubleUs x y = doubleMe x + doubleMe y | cs |
이제 100보다 작거나 같은 경우에만 2배를 하는 함수를 만들어보자. baby.hs 에 다음 라인을 추가한다.
1 | doubleSmallNumber x = if x > 100 then x else x*2 | cs |
1 2 3 4 5 6 7 | *Main> :reload [1 of 1] Compiling Main ( baby.hs, interpreted ) Ok, modules loaded: Main. *Main> doubleSmallNumber 95 190 *Main> doubleSmallNumber 109 109 | cs |
하스켈의 if 문이 여타 언어와 다른 점은, else 파트가 필수적이라는 것이다. 그리고 또 하나는 하스켈에서 if 문은 표현식(expression)이라는 것이다. 표현식이라고 하는 것은 값을 반환해주는 코드의 일부를 말한다. 5 역시 5를 반환하기 때문에 표현식이다. 4 + 8 역시 마찬가지다. else 가 필수적이기 때문에, if 문은 반드시 무언가를 반환하게 마련이고 그렇기 때문에 if 문은 표현식인 것이다. 앞서 작성한 doubleSmallNumber 함수에 모든 숫자에 1을 더하고 싶다면 다음과 같이 작성할 수 있을 것이다.
1 | doubleSmallNumber' x = (if x > 100 then x else x*2) + 1 | cs |
apostrophe는 하스켈에서 특별한 의미를 지니지 않으며, 함수 이름에 사용할 수 있는 유효한 문자일 뿐이다. 즉, 다음과 같은 함수도 가능한 것이다.
1 | conanO'Brien = "It's a-me, Conan O'Brien!" | cs |
여기에 2가지 주목할만한 점이 있다. 하나는 Conan 이름을 대문자로 표시하지 않았다는 점이다. 왜냐하면 함수는 대문자로 시작해서는 안되기 때문이다. 그 이유는 추후에 살펴볼 것이다. 두 번째 주목할 점은 아무런 파라메터를 가지지 않는다는 점이다. 함수가 파라메터를 가지지 않을 때, 우리는 정의라고 부를 수 있다. 정의를 하고 나면 그것이 의미하는 바를 바꿀 수 없기 때문이다.
'프로그래밍 Programming' 카테고리의 다른 글
하스켈 Starting out - (4) 리스트 입문 (0) | 2017.12.01 |
---|---|
하스켈 Starting out - (3) 리스트 입문 (0) | 2017.12.01 |
하스켈 Starting out - (1) 간단한 수학 연산 (0) | 2017.11.30 |
하스켈 웹프레임워크 - Yesod 라우팅 구문 Routing Syntax (0) | 2017.11.30 |
Haskell 웹프레임워크 Yesod 퀵 스타트 가이드 (0) | 2017.11.25 |