모듈

긴 프로그램은 여러 개의 부분으로 나누어 관리하면 편리하다. 이 '부분'들을 모듈(module)이라고 부른다. 모듈을 만드는 법은 간단하다. Base라는 이름의 모듈을 만들고 싶다면 "module Base where"라는 문장으로 시작하는 파일을 만들어서 Base.hs라는 이름으로 저장하면 된다.

다른 모듈을 읽어들일 때는 "import 모듈이름"이라는 문장을 사용한다. 만약 Base 모듈을 읽어들이려면 "import Base"라고 입력한다.

경우에 따라 모듈 안에 있는 함수 중 일부만 필요할 수도 있다. 이때는 모듈 이름 뒤에 괄호를 치고 원하는 함수 이름을 적어준다. 같은 방법으로 모듈에서 일부 함수만 외부에 공개할 수도 있다. 예를 들어 Base 모듈에서 foo 함수와 bar 함수만 읽어들이거나 또는 공개하고 싶다면

import Base (foo, bar) -- foo, bar만 읽어들이기

module Base (foo, bar) where -- foo, bar만 공개

위와 같이 해주지 않으면 import는 공개된 모든 함수를 읽어들인다. 반대로 읽어들이고 싶지 않은 함수를 지정할 수도 있다.

import Base hiding (foo, bar) -- foo, bar만 제외하고 읽어들이기

두 모듈에서 이름 같고 서로 다른 함수를 읽어들일 경우엔 "모듈이름.함수이름" 형식으로 모듈이름과 함수이름 사이에 마침표(.)를 찍어 표현해준다.

Base.foo -- Base 모듈의 foo 함수
Super.foo -- Super 모듈의 foo 함수

함수를 합성시킬 때도 사용되는 마침표(.)는 하나의 함수기 때문에 좌우에 공백이 있어야 하지만, 함수가 어느 모듈에 속하는 지를 표현할 때는 여백이 없어야 한다.

f.g -- f 모듈의  g 함수
f . g -- f 함수와 g 함수를 합성

비슷한 기능의 모듈들을 한 이름공간(namespace)에 모아두면 편리할 수 있다. 만약 Stack모듈과 Queue 모듈을 DatsStr이라는 이름 공간에 담아두고 싶다면, DataStr이라는 디렉토리를 만들고 여기에 Stack.hs와 Queue.hs를 저장한다. 모듈을 불러들일 때는 역시 마침표(.)를 이용한다.

파일명읽어들이기
DataStr.hs import DataStr
DataStr/Stack.hs import DataStr.Stack
DataStr/Stack.hs import DataStr.Queue

Comments

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.

모호성을 피하기 위한 키워드: qualified

import를 사용해 모듈을 불러들였을 때, 이름 공간(namespace)은 공유를 하게 됩니다. MyModule이라는 모듈에도 e라는 함수가 있고 AnotherModule이라는 모듈에도 e라는 함수가 있을 경우, 두 모듈을 모두 import하면 모호성(ambiguity)이 생깁니다. 이같은 모호성을 피하기 위해서 qualified라는 키워드를 사용합니다.

import qualified MyModule
import qualified AnotherModule

이렇게 하면 함수 eMyModule.e 또는 AnotherModule.e 식으로만 사용할 수 있게 됩니다.

import의 자세한 용법은 http://haskell.org/haskellwiki/Import

DataStr/Stack.hs 가 두 개

이제서야 알아차렸는데 맨 밑의 표에 DataStr/Stack.hs 가 중복되어 있군요;