Haskell study 7

9
Haskell Study 7. module

Transcript of Haskell study 7

Page 1: Haskell study 7

Haskell Study

7. module

Page 2: Haskell study 7

Module

조금 큰 규모의 프로그램을 짜다보면 반드시 소스 코드를 각각의 역할에 맞게 분리해서 모듈화를

해야할 필요성이 생깁니다.

Haskell의 표준 라이브러리에는 이미 각각의 역할에 맞는 여러가지 모듈들이 있고, 각 모듈에 어떤

함수들이 있는지는 Hoogle등에서 검색을 통해 알아볼 수 있습니다.

이미 존재하는 다른 모듈을 쓰기 위해서는 import 구문을 씁니다.

import (module name)

Page 3: Haskell study 7

Module

대표적으로 많이 쓰는 Data.List 모듈을 쓰는 예제입니다.

--test.hs

import Data.List

-- nub 함수는 리스트에서 중복되는 요소를 모두 제거합니다. Data.List에 정의되어 있습니다.

numUniques :: (Eq a) => [a] -> Int

numUniques = length . nub

Prelude> :l test.hs

*Main> numUniques [1,1,1,2,2,1,2,3,1,2,3]

3

Page 4: Haskell study 7

Module

모듈에서 특정 몇 개의 함수만을 가져와서 쓰고 싶을 땐 다음과 같이 씁니다.

import Data.List (nub, sort)

특정 함수를 제외한 나머지를 모두 가져와서 쓰고 싶을 땐 다음과 같이 씁니다.

import Data.List hiding (nub)

Page 5: Haskell study 7

Module

이름 충돌이 일어났을 땐 모듈을 명시적으로 포함(qualified import)할 수 있습니다. 이 경우 모듈

내의 함수를 쓸 때 앞에 모듈 이름을 붙여줘야합니다.

import qualified Data.List

numUniques :: (Eq a) => [a] -> Int

numUniques = length . Data.List.nub

모듈 이름이 너무 길어서 불편할 경우 별칭을 붙여줄 수 있습니다.

import qualified Data.List as L

numUniques = length . L.nub

Page 6: Haskell study 7

Module

보통 자주 쓰이는 모듈들은 아래와 같습니다. 이 모듈에 어떤 함수들이 있는지 한 번쯤 훑어보시는

것도 좋습니다.

•Data.List

리스트와 관련된 유용한 함수들이 많이 있습니다. sort, group, find, nub 등 일반적으로 리스트에

관해 많이 쓰는 함수들은 다 정의되어 있으니 리스트에 대해 뭔가 작업을 하고 싶다면 코드를 짜기

전에 동일한 함수가 이 모듈에 있는 지 한 번 확인해보시는 게 좋습니다.

•Data.Char

문자 처리와 관련된 함수들이 모여있습니다. 역시 문자, 문자열 관련 작업을 할 땐 먼저 이 모듈 내의

함수를 살펴보시는 걸 권합니다.

•Data.Map

타 언어의 map(tree 기반의 key-value 자료구조)와 동일합니다. key-value 쌍 자료구조가

필요하다면 Data.Map을 참고합시다.

Page 7: Haskell study 7

Make Module

그러면 모듈을 만들기 위해선 어떻게 해야할까요? 간단한 예제를 통해 살펴봅시다. 우선, 모듈의

이름은 반드시 파일의 이름과 동일해야합니다.

파일의 맨 위에 module (module name) where 라고 써서 해당 파일의 모듈명을 명시해줄 수

있습니다.

--Test.hs

module Test where

foo = "foo"

bar = "bar"

Page 8: Haskell study 7

Make Module

모듈 내부에서 특정한 함수들만 외부로 내보내고 싶다면(나머지 함수들은 모듈 내부에 정의되어

있어도 외부에서 쓰지 못하게 만들고 싶다면) 모듈 이름 옆에 해당 함수들의 이름을 적어주면 됩니다.

아무 함수도 적지 않을 경우 모듈 내의 모든 함수가 export됩니다.

--Test.hs - foo 만 외부에서 사용 가능

module Test (foo) where

foo = "foo"

bar = "bar"

Page 9: Haskell study 7

Make Module

라이브러리를 만들 때는 보통 여러 개의 모듈이 필요하고, 각각의 모듈에 대한 서브모듈

(submodule)이 필요할 때도 많습니다. 이럴 때 Haskell에서는 모듈을 디렉토리 상에서 계층

구조로 나눠 관리하며, 각 서브 모듈은 (자신이 속한 폴더의 이름).(모듈 이름) 형태의 이름을 붙여

관리합니다.

--Test.hs - foo 만 외부에서 사용 가능

module Test where

import Test.Foo

--Test 폴더의 Foo.hs 파일

module Test.Foo (foo) where

foo = "foo"