2013-10-08 5 views
4

С помощью Perl's standard module exports вы можете указать наборы функций для экспорта/импорта по тегу.Любая система импорта подмножества модулей в haskell?

Итак, у вас могут быть комплекты, такие как :all или :private или :test или что угодно.

По-видимому, совет состоит в том, что если вы просто хотите получить некоторые полу-частные функции, тогда у вас есть «внутренний» модуль и реэкспортируйте его «по умолчанию».

Я начинаю хотеть полу-частный интерфейс для целей тестирования. Итак, это еще способ сделать это, или я чего-то не хватает в недавнем ghc?

ответ

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, который будет импортирован Foo и Foo.Private.

Также, в отличие от perl, ghc не поддерживает определение нескольких модулей в одном файле yet, что делает это решение несколько тяжеловесным.

+0

«Еще» в «ghc» не поддерживает определение нескольких модулей в безопасном файле пока «не кажется точным, так как ошибка Trac, на которую он ссылается, закрывается как« wontfix ». –

+0

Это не значит много. Если кто-то придумает хорошую подачу и реализует эту функцию, я думаю, что у нее будет высокая вероятность усыновления. Даже Monad/Аппликативное предложение реализуется - все возможно! –

2

Вы можете импортировать подмножество функций с помощью этого:

import Data.List (nub, sort) 

Это будет импортировать только nub и sort из модуля Data.List. Скажем, в случае, если вы не хотите что-то импортировать, а затем:

import Data.List hiding (sort) 

Это будет импортировать все функции в модуле Data.List кроме функции сортировки.

И в случае, если вы хотите экспортировать только некоторые функции из модуля затем определить их следующим образом:

module Data.List 
    (sort, 
     nub 
    ) where 

Это будет только экспортировать sort и nub функции в модуле.

+0

или 'import qualified Data.Map as M' – wit

+2

Это не подмножество - это явный список функций. –

0

the haskell version of doctest запускает код таким образом, чтобы неэкспортированные функции находились в области видимости.

+0

Спасибо - интересно. Маленькое, что я могу понять из кода, предполагает, что он делает это, запустив модуль через библиотечную версию ghci. –

+0

Право и ghci делает это при условии, что модуль не загружается как скомпилированный код (т. Е. Когда ваше приглашение выглядит как '* M>' not 'M>') – aavogt

Смежные вопросы