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

Haskell - способы иметь чистый блок импорта? (реэкспортирование модулей? многократный импорт на линию?)

Я часто имею привычку иметь стандартный блок импорта, поэтому я часто использую функциональность под рукой, когда мне это нужно. Например,

-- license block

{-# LANGUAGE Arrows,
            DeriveDataTypeable,
            EmptyDataDecls,
            FlexibleContexts,
            FlexibleInstances,
            FunctionalDependencies,
            GADTs,
            MultiParamTypeClasses,
            NoMonomorphismRestriction,
            RankNTypes,
            ScopedTypeVariables,
            StandaloneDeriving,
            TypeOperators,
            TypeSynonymInstances,
            UndecidableInstances,
            ViewPatterns #-}

module MyModule where

import Prelude hiding (id, (.))
import Control.Arrow
import Control.Category
import Control.Exception
import Control.Monad
import Control.Monad.ST

import Data.Array.Diff
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Heap as Heap
import qualified Data.List as List
import qualified Data.List.Key as Key
import Data.List.HT
import Data.Maybe
import Data.STRef
import qualified Data.Text as T

Поскольку я не использую какие-либо причудливые IDE, я бы предпочел не читать это в каждом файле. Есть ли способ создать какой-то "стандартный" / "служебный" модуль, который реэкспортирует имена этих функций, поэтому я могу просто напечатать,

import MyCommonFuncs

вместо

Я знаю, что это, может быть, не очень хорошая практика, и, может быть, в теории нужно добавить минимальное количество необходимых им импорта, но, как я уже сказал, мне нужно иногда взламывать, и иметь меньше вещей, о которых нужно думать, всегда хорошо.

EDIT - что более важно, иногда я хочу изменить блок для всех файлов, поэтому текущая система импорта всего по отдельности может быть утомительной. Предположим, например, что мне нужно удалить старый import Time и изменить его на новый [sic?] import System.Time. Затем, с текущей системой, я должен редактировать все файлы. Или, может быть, я узнаю о новой языковой функции и хочу, чтобы она всегда была доступна - тогда мне нужно вручную обновить старые исходные файлы.

4b9b3361

Ответ 1

Вы можете попробовать использовать синтаксис

module MyCommonFuncs (
    module Control.Arrow,
    module Control.Category,
    module Control.Exception,
    module Control.Monad,
    module Control.Monad.ST
)

import Control.Arrow
import Control.Category
import Control.Exception
import Control.Monad
import Control.Monad.ST

Когда вы это сделаете, все функции в этих модулях экспортируются, как если бы они были определены в самом модуле MyCommonFuncs.

Что касается прагмы LANGUAGE, вы можете определить тот, который вы хотите в файле .cabal, они используются глобально. Просто не при тестировании через ghci.

Надеюсь, что это помогло.

Ответ 2

Вы можете, конечно, написать настраиваемый модуль, который реэкспортирует все эти импорт. Это обычная практика в базовых библиотеках. См. import Foreign,

module Foreign
        ( module Data.Bits
        , module Data.Int
        , module Data.Word
        , module Foreign.Ptr
        , module Foreign.ForeignPtr
        , module Foreign.StablePtr
        , module Foreign.Storable
        , module Foreign.Marshal
        ...

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

Ответ 3

Гато,

Хммм... Я сразу подумал #define, поэтому я googled "препроцессор haskell", который дает "многообещающий" результат.

У меня нет подсказки, если это хороший ответ (потому что я вообще не знаю Haskell), но это почти наверняка ответ AN... Мне будет интересно посмотреть, что придумали гуру.

Приветствие. Кит.