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