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 описывает, фактически является стандартным.