Haskell Language
모듈
수색…
통사론
module Name 여기서 -이 파일에 선언 된 모든 이름을 내 보냅니다.
module Name (functionOne, Type (..)) 여기서 - functionOne, Type 및 Type의 생성자 만 내 보냅니다.
import Module - 모듈의 모든 내 보낸 이름 가져 오기
MN으로 자격을 갖춘 모듈 가져 오기 - 정규화 된 가져 오기
import 모듈 (justThisFunction) - 모듈에서 특정 이름 만 가져 오기
import 모듈 숨기기 (functionName, Type) - functionName과 Type을 제외한 모듈에서 모든 이름 가져 오기
비고
Haskell은 모듈을 지원합니다 :
모듈은 모두 또는 멤버 유형 및 함수의 하위 집합을 내보낼 수 있습니다.
모듈은 다른 모듈에서 가져온 이름을 "다시 내보낼"수 있습니다
모듈의 소비자 측에서는 다음을 수행 할 수 있습니다.
모두 가져 오기 또는 모듈 구성원의 하위 집합 가져 오기
특정 멤버 또는 멤버 집합의 가져 오기 숨기기
haskell.org 에는 모듈 정의에 대한 훌륭한 장이 있습니다.
자신의 모듈 정의하기
우리가 Business.hs
라는 파일을 가지고 있다면, 다음과 같이 import
수있는 Business
모듈을 정의 할 수 있습니다 :
module Business (
Person (..), -- ^ Export the Person type and all its constructors and field names
employees -- ^ Export the employees function
) where
-- begin types, function definitions, etc
더 깊은 계층 구조는 물론 가능합니다. Hierarchical 모듈 이름 예를 참조하십시오.
생성자 내보내기
형식 및 모든 생성자를 내보내려면 다음 구문을 사용해야합니다.
module X (Person (..)) where
따라서 People.hs
라는 파일의 다음 최상위 정의에 대해서는 다음과 같습니다.
data Person = Friend String | Foe deriving (Show, Eq, Ord)
isFoe Foe = True
isFoe _ = False
맨 위에있는이 모듈 선언 :
module People (Person (..)) where
Person
과 그 생성자 Friend
와 Foe
만 내보낼 수 있습니다.
module 키워드 다음에 오는 내보내기 목록이 생략되면 모듈의 최상위 레벨에 바인드 된 모든 이름이 익스포트됩니다.
module People where
Person
, 그 생성자, 그리고 isFoe
함수를 export 할 것이다.
모듈의 특정 멤버 가져 오기
하스켈은 모듈에서 항목의 하위 집합을 가져 오는 것을 지원합니다.
import qualified Data.Stream (map) as D
Data.Stream
에서 map
만 가져 Data.Stream
함수를 호출하려면 D.
가 필요합니다.
D.map odd [1..]
그렇지 않으면 컴파일러는 Prelude
의 map
함수를 사용하려고합니다.
수입 숨기기
Prelude는 종종 그 이름이 다른 곳에서 사용되는 함수를 정의합니다. 이러한 가져 오기를 숨기지 않거나 충돌이 발생하는 정규화 된 가져 오기를 사용하면 컴파일 오류가 발생합니다.
Data.Stream
은 map
, head
및 tail
이라는 함수를 정의합니다.이 함수는 일반적으로 Prelude에 정의 된 함수와 충돌합니다. 우리는 서곡 사용에서 그 수입 숨길 수 있습니다 hiding
:
import Data.Stream -- everything from Data.Stream
import Prelude hiding (map, head, tail, scan, foldl, foldr, filter, dropWhile, take) -- etc
실제로, Prelude 충돌을 숨기기에는 너무 많은 코드가 필요하므로 실제로 대신 Data.Stream
의 qualified
가져 오기를 사용합니다.
적격 수입
여러 모듈이 같은 함수를 이름으로 정의하면 컴파일러는 불평 할 것입니다. 이러한 경우 (또는 가독성을 높이기 위해) qualified
가져 오기를 사용할 수 있습니다.
import qualified Data.Stream as D
이제 Prelude
와 Data.Stream
정의 된 map
을 사용할 때 모호성 컴파일러 오류를 방지 할 수 있습니다.
map (== 1) [1,2,3] -- will use Prelude.map
D.map (odd) (fromList [1..]) -- will use Data.Stream.map
단지 충돌하는 이름을 통해 자격되면서 모듈을 가져올 수도 있습니다 import Data.Text as T
하나를 가질 수 있습니다, Text
대신 T.Text
등
계층 적 모듈 이름
모듈의 이름은 파일 시스템의 계층 적 구조를 따른다. 다음 파일 레이아웃을 사용합니다.
Foo/
├── Baz/
│ └── Quux.hs
└── Bar.hs
Foo.hs
Bar.hs
모듈 헤더는 다음과 같습니다.
-- file Foo.hs
module Foo where
-- file Bar.hs
module Bar where
-- file Foo/Bar.hs
module Foo.Bar where
-- file Foo/Baz/Quux.hs
module Foo.Baz.Quux where
참고 사항 :
- 모듈 이름은 모듈을 선언 한 파일의 경로를 기반으로합니다.
- 폴더는 모듈과 이름을 공유 할 수 있으며 모듈에 자연스럽게 계층 적 이름 지정 구조를 제공합니다.