Ответ 1
Это приятное свойство Python, потому что его "словари все вниз", так сказать.
Haskell позволяет назначать псевдонимы для модулей, но нет возможности выполнять функции псевдонимов
из инструкции import
(насколько я знаю). Лучшее, что вы могли бы сделать, это
import qualified Fruit as F (apple)
banana = F.apple
Вы можете поместить это в свой собственный модуль и экспортировать нужные значения, скрывая детали всего этого, но это похоже на большую работу для чего-то настолько простого.
Как прокомментировано ниже хаммаром, ограничение мономорфизма может вызвать проблемы с предполагаемым типом
of banana
. Чтобы быть в безопасности, вы должны либо аннотировать banana
своим желаемым типом (возможно, из apple
), либо отключить ограничение мономорфизма как
{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Fruit as F (apple)
banana = F.apple
В противном случае выводимый тип banana
может быть менее полиморфным, чем хотелось бы.
Ограничение мономорфизма пытается назначить конкретный экземпляр класса типа для каждой функции верхнего уровня (это делается по соображениям производительности). Рассмотрим,
example = return ()
Эта функция должна иметь тип Monad m => m ()
, но из-за ограничения мономорфизма недостаточно информации о том, какой экземпляр Monad следует использовать, поэтому вы получите следующее сообщение
Ambiguous type variable `m0' in the constraint:
(Monad m0) arising from a use of `return'
Possible cause: the monomorphism restriction applied to the following:
example :: m0 () (bound at Test.hs:44:1)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
In the expression: return ()
In an equation for `example': example = return ()
Теперь, если вы предоставили достаточно информации для GHC, чтобы указать, какой экземпляр Monad вы используете, например
example = return ()
main :: IO ()
main = example
то GHC даст следующий тип
*Main> :t example
example :: IO ()
так как вы сказали, что example
будет иметь тот же тип, что и main