Подтвердить что ты не робот

Импорт функции с псевдонимом в Haskell

В Haskell я пишу import Fruit или import Fruit (apple) и могу получить доступ к apple или Fruit.apple.

В Python я могу написать from Fruit import apple для apple или import Fruit для Fruit.apple.

Я также могу написать import Fruit.apple as banana в Python для ссылки на ту же функцию, что и banana.

Как, в Haskell я могу это сделать? import Fruit as Vegetable на любом языке можно переименовать Fruit, но я хочу переименовать apple.

4b9b3361

Ответ 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

Ответ 2

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

import qualified Fruit (apple)
banana = Fruit.apple