Подтвердить что ты не робот

Haskell: скрывать определенные функции в экспорте модулей?

У меня есть модуль Haskell, и Id нравится экспортировать все объекты, объявленные в его файле, за исключением одной конкретной функции local_func.

Есть ли более чистый способ добиться этого, чем написать список экспорта, явно перечисляющий все другие объявления (и тщательно сохраняя этот список актуальным на всю вечность)?

Другими словами, Id как аналог import MyModule hiding (local_func), но указанный в модуле экспорта, а не во время импорта.

4b9b3361

Ответ 1

Насколько я знаю, в настоящее время нет способа сделать это.

То, что я обычно делаю, это иметь центральный модуль, который ретранслирует важные вещи как удобный способ импортировать все, что необходимо, не скрывая ничего в модулях, определяющих эти вещи (которые в некоторых случаях - что вы, вероятно, выиграли 't предвидеть! - облегчает для ваших пользователей изменение вещей в вашем модуле).

Для этого используйте следующий синтаксис:

-- |Convenient import module
module Foo.Import (module All) where

-- Import what you want to export
import Foo.Stuff as All hiding (local_func)
-- You can import several modules into the same namespace for this trick!
-- For example if using your module also requires 'decode' from "Data.Aeson" you can do
import Data.Aeson as All (decode)

Теперь вы легко экспортировали эти вещи.

Ответ 2

К сожалению, нет.

Можно было бы представить небольшое синтаксическое дополнение, которое позволяло бы то, о чем вы просите. Прямо сейчас можно написать:

module M (module M) where

foo = quux

quux = 1+2

Вы можете явно экспортировать весь модуль. Но предположим, что мы должны добавить синтаксис, чтобы можно было скрыться от этого модуля. Тогда мы сможем написать вот так:

module M (module M hiding (quux)) where

foo = quux

quux = 1+2