갈루아의 반서재

728x90

이제 간단한 함수를 만들어보자.

함수는 호출될 때와 유사한 방식으로 정의된다. 함수 이름에 이어 공백 다음에 파라메터가 나온다. 하지만 함수를 정의할 때는 = 다음에 해당 함수가 수행할 기능이 나온다. 아래와 같이 작성한 후 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 이름을 대문자로 표시하지 않았다는 점이다. 왜냐하면 함수는 대문자로 시작해서는 안되기 때문이다. 그 이유는 추후에 살펴볼 것이다. 두 번째 주목할 점은 아무런 파라메터를 가지지 않는다는 점이다. 함수가 파라메터를 가지지 않을 때, 우리는 정의라고 부를 수 있다. 정의를 하고 나면 그것이 의미하는 바를 바꿀 수 없기 때문이다. 

728x90