수색…


통사론

  • 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 과 그 생성자 FriendFoe 만 내보낼 수 있습니다.

module 키워드 다음에 오는 내보내기 목록이 생략되면 모듈의 최상위 레벨에 바인드 된 모든 이름이 익스포트됩니다.

module People where

Person , 그 생성자, 그리고 isFoe 함수를 export 할 것이다.

모듈의 특정 멤버 가져 오기

하스켈은 모듈에서 항목의 하위 집합을 가져 오는 것을 지원합니다.

import qualified Data.Stream (map) as D

Data.Stream 에서 map 만 가져 Data.Stream 함수를 호출하려면 D. 가 필요합니다.

D.map odd [1..]

그렇지 않으면 컴파일러는 Preludemap 함수를 사용하려고합니다.

수입 숨기기

Prelude는 종종 그 이름이 다른 곳에서 사용되는 함수를 정의합니다. 이러한 가져 오기를 숨기지 않거나 충돌이 발생하는 정규화 된 가져 오기를 사용하면 컴파일 오류가 발생합니다.

Data.Streammap , headtail 이라는 함수를 정의합니다.이 함수는 일반적으로 Prelude에 정의 된 함수와 충돌합니다. 우리는 서곡 사용에서 그 수입 숨길 수 있습니다 hiding :

import Data.Stream -- everything from Data.Stream
import Prelude hiding (map, head, tail, scan, foldl, foldr, filter, dropWhile, take) -- etc

실제로, Prelude 충돌을 숨기기에는 너무 많은 코드가 필요하므로 실제로 대신 Data.Streamqualified 가져 오기를 사용합니다.

적격 수입

여러 모듈이 같은 함수를 이름으로 정의하면 컴파일러는 불평 할 것입니다. 이러한 경우 (또는 가독성을 높이기 위해) qualified 가져 오기를 사용할 수 있습니다.

import qualified Data.Stream as D

이제 PreludeData.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

참고 사항 :

  • 모듈 이름은 모듈을 선언 한 파일의 경로를 기반으로합니다.
  • 폴더는 모듈과 이름을 공유 할 수 있으며 모듈에 자연스럽게 계층 적 이름 지정 구조를 제공합니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow