haskell - как получить чистый блок импорта? (реэкспорт модулей? несколько импортов на строку?) - PullRequest
12 голосов
/ 15 мая 2011

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

-- 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

вместо

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

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

Ответы [ 3 ]

18 голосов
/ 15 мая 2011

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

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.

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

9 голосов
/ 15 мая 2011

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

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
        ...

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

0 голосов
/ 15 мая 2011

Гато,

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

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

Ура, приятель. Кит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...