2012-09-29 34 views
17

W Haskell, piszę import Fruit lub import Fruit (apple) i mogę uzyskać dostęp do apple lub Fruit.apple.Importowanie funkcji za pomocą aliasu w Haskell

W języku Python mogę napisać from Fruit import apple dla apple lub import Fruit dla Fruit.apple.

Myślę, że można również napisać import Fruit.apple as banana w języku Python, aby odnieść się do tej samej funkcji, co banana.

Jak w Haskell mogę to zrobić? import Fruit as Vegetable w obu językach można zmienić nazwę Fruit, ale chcę zmienić nazwę jabłka.

+0

dla twojej informacji, jestem szczególnie w tej chwili próbuje importować Data.List.genericLength jak długość, aby uzyskać pozbyć się Int bez refaktoryzacji. –

+0

Zastanawiam się, jak łatwa lub trudna byłaby łatka GHC, aby zaakceptować następującą składnię: 'import Fruit (apple as banana)'. – Wizek

Odpowiedz

17

Jest to fajna właściwość, którą Python ma, ponieważ tak naprawdę "słowniki są na dole". Haskell umożliwia przypisanie aliasów do modułów, ale nie ma sposobu na aliasy funkcji z oświadczenia import (o ile wiem). Najlepszym byłbyś w stanie zrobić, to

import qualified Fruit as F (apple) 
banana = F.apple 

Można umieścić to w swoim własnym modułem i wyeksportować żądane wartości, ukrywając szczegóły tego wszystkiego, ale to wydaje się dużo pracy do czegoś tak prostego .

Zgodnie z komentarzem przedstawionym poniżej przez hammar, ograniczenie monomorfizmu może spowodować problemy z wywnioskowanym typem z banana. Aby być bezpiecznym, należy albo opisywanie banana z żądanego typu (chyba że od apple) lub wyłączyć ograniczenie monomorfizm jak

{-# LANGUAGE NoMonomorphismRestriction #-} 
import qualified Fruit as F (apple) 
banana = F.apple 

przeciwnym razie wywnioskować typ banana może być mniejsza niż pożądana polimorficzny.

Ograniczenie monomorfizmu usiłuje przypisać konkretną instancję klasy typów dla każdej funkcji najwyższego poziomu (odbywa się to z przyczyn związanych z wydajnością). Rozważmy

example = return() 

Funkcja ta powinna mieć typ Monad m => m(), ale ze względu na ograniczenia monomorfizm, nie ma wystarczająco dużo informacji na temat, który powinien być stosowany instancji Monada, więc pojawia się następujący komunikat

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() 

teraz , jeżeli zapewniają wystarczająco dużo informacji, aby wywnioskować GHC które instancja Monady używasz, takie jak

example = return() 

main :: IO() 
main = example 

następnie GHC da Follo Typ

*Main> :t example 
example :: IO() 

ponieważ powiedziano jej, że example będzie mieć ten sam typ jak main

+2

Czy to nie 'banana = F.apple'? – Artyom

+0

@ArtyomKazak Tak jest! – sabauma

+8

Uważaj jednak na ograniczenie monomorfizmu, lub "banana" może mieć bardziej restrykcyjny typ niż "jabłko". – hammar

7

Nie ma składni, które bezpośrednio skrzydło. Przypuszczalnie chcesz uniknąć starcia z lokalnie zdefiniowane apple, więc pójdę z

import qualified Fruit (apple) 
banana = Fruit.apple