4

Perl の標準モジュール エクスポートを使用すると、タグによってエクスポート/インポートする関数のセットを指定できます。

:allしたがって、または:privateまたはその他のようなセットを使用できます:test

歴史的に、アドバイスは、セミプライベート関数が必要な場合は、「内部」モジュールを持ち、その「デフォルト」部分を再エクスポートすることです。

テスト用のセミプライベート インターフェイスが必要になり始めています。それで、それはまだそれを行う方法ですか、それとも最近のghcで何かが欠けていますか?

4

3 に答える 3

4

いいえ、Haskell ではできません。

この問題に対する Haskell の解決策は、個別のモジュールを用意することです。例えば

module Foo.Private
  ( private1
  , private2
  , private3
  ) where

...

module Foo
  ( public1
  , public2
  , public3
  ) where

...

さらに、Foo.Privateからすべてを再エクスポートする場合Foo:

module Foo.Private
  ( module Foo
  , private1
  , private2
  , private3
  ) where

import Foo

...

しかし、次に をFooインポートする場合Foo.Privateは、再帰モジュールを使用するか、実際の定義をFoo.Baseと によってインポートされる3 番目のモジュールに移動する必要がFooありFoo.Privateます。

また、perl とは異なり、ghc はまだ同じファイル内で複数のモジュールを定義することをサポートしていないため、このソリューションはやや重くなります。

于 2013-10-09T08:21:11.673 に答える
2

これを使用して、関数のサブセットをインポートできます。

import Data.List (nub, sort)

これは、Data.List モジュールからのみインポートnubされます。sort何かをインポートしたくない場合は、次のようにします。

import Data.List hiding (sort)

これにより、並べ替え関数を除く Data.List モジュールのすべての関数がインポートされます。

モジュールから特定の関数のみをエクスポートする場合は、次のように定義します。

module Data.List
    ( sort,
      nub
    ) where

sortこれにより、モジュール内のおよびnub関数のみがエクスポートされます。

于 2013-10-08T20:03:04.517 に答える
0

doctest の haskell バージョンは、エクスポートされていない関数がスコープ内にあるようにコードを実行します。

于 2013-10-08T20:48:52.440 に答える