Haskell * квалифицированный * импорт набора функций

В Haskell я могу импортировать модуль, соответствующий его имени или имени ярлыка, например:

import qualified Data.List as List
import qualified Data.Map

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

import Data.List (sort, intersperse)
import Data.Map hiding (findWithDefault)

Можно ли импортировать определенный набор функций, например, в приведенном выше примере import Data.List (sort, intersperse), но чтобы гарантировать, что функции все еще идентифицированы квалифицированным способом, например List.sort и List.intersperse?

Хотя это не работает, это дух того, о чем я прошу:

import qualified Data.List (sort, intersperse) as List

или, возможно,

import qualified Data.List as List (sort, intersperse)

Ответ 1

import qualified Data.List as List (sort, intersperse)

Это на самом деле прекрасно и работает. Грамматика импортной декларации выглядит следующим образом:

5.3 Декларации импорта

impdecl   →   import [qualified] modid [as modid] [impspec]

qualified и as не препятствуют спецификации импорта. Это не дополнение Haskell2010, так как оно было частью отчета Haskell 98.

С другой стороны, ваш первый пример

import qualified Data.List (sort, intersperse) as List
--     qualified           impspec!            as modid
--                            ^                    ^         
--                            +--------------------+

не соответствует грамматике, так как impspec должен быть последним элементом в объявлении импорта, если он предоставлен.

Ответ 2

Несмотря на то, что он не упоминается в https://www.haskell.org/haskellwiki/Import, import qualified Foo as Bar (x, y), кажется, отлично работает для меня. Я запускаю ghc 7.6.3. Возможно, эта страница wiki устарела. Если это не сработает для вас, какую версию ghc вы используете?

Ответ 3

Это разрешено, по крайней мере, согласно отчету Haskell 2010. Сначала просмотрите примеры, которые включают этот:

import qualified A(x)

Затем посмотрите на фактическую спецификацию синтаксиса, которая указывает, что qualified, as и "impspec" ( список импортированных идентификаторов или список скрытых идентификаторов) являются необязательными и независимыми. Таким образом, синтаксический genisage описывает, фактически является стандартным.