Это ограничение также удобно, когда импортирующий модуль должен повторно объявлять некоторые имена в импортированном модуле на основе объявлений квалифицированного импорта. Например:
module MyPrelude (succ, module Prelude) where
import qualified Prelude as P (succ)
import Prelude hiding (succ)
succ :: ...
succ = ... P.succ ...
эту идиому было бы действительно трудно выразить без большого количества многословия в противном случае. Кроме того, спросите себя: «Будет ли это иметь смысл без иерархических модулей?». Если нет, то это очень специфично для ghc, и то, что происходит при обращении к имени иерархического модуля из выражения, вообще не является иерархическим.
Относительно того, почему вы можете реэкспортировать отдельные символы с определенным именем модуля, которое вы не импортировали, это похоже на то, как заставить иерархические модули работать иерархически в ghc. Получение квалифицированных символов Foo.B при импорте Foo.A является волшебным, и я думаю, что это потому, что имя Foo не более реальный наследник, чем Foo.A, но предполагаемое использование экспорта вещей с альтернативной квалификацией - в случаях, когда его используют из Фу. Я не думаю, что это поведение имеет смысл вообще без расширений GHC, поэтому я собираюсь сделать дикое предположение, что это специфично для GHC.