2012-09-29 10 views
17

In Haskell schreibe ich import Fruit oder import Fruit (apple) und kann auf apple oder Fruit.apple zugreifen.Importfunktion mit einem Alias ​​in Haskell

In Python kann ich schreiben from Fruit import apple für apple oder import Fruit für Fruit.apple.

Ich denke, kann auch schreiben import Fruit.apple as banana in Python auf die gleiche Funktion wie banana verweisen.

Wie, in Haskell kann ich das tun? import Fruit as Vegetable in jeder Sprache kann Fruit umbenennen, aber ich möchte Apple umbenennen.

+0

Zur Information gehen, ich bin vor allem in diesem Moment zu importieren versuche Data.List.genericLength als Länge zu erhalten los von Int ohne Refactoring. –

+0

Ich frage mich, wie einfach oder schwer es wäre, GHC zu patchen, um die folgende Syntax zu akzeptieren: 'import Fruit (Apfel als Banane)'. – Wizek

Antwort

17

Dies ist eine nette Eigenschaft, die Python hat, weil es sozusagen "Wörterbücher ganz nach unten" gibt. Haskell erlaubt Ihnen, Aliase zu Modulen zuzuweisen, aber es gibt keine Möglichkeit, die Funktionen von der import-Anweisung (soweit ich weiß) zu aliasieren. Das Beste, was Sie zu tun, wäre in der Lage, ist

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

Sie könnten dies in einem eigenen Modul setzen und die Werte exportieren Sie wollen, um die Details von alledem versteckt, aber das scheint wie eine Menge Arbeit für etwas so einfach .

Wie unten von hammar kommentiert, könnte die Monomorphie-Einschränkung zu Problemen mit dem gefolgerten Typ von banana führen. Um sicher zu sein, sollten Sie entweder mit Anmerkungen versehen banana mit seinem gewünschten Typ (wahrscheinlich, dass die apple) oder deaktivieren Sie die Monomorphie Einschränkung als

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

Andernfalls wird die abgeleitete Art von banana könnte weniger polymorph als erwünscht.

Die Monomorphism-Einschränkung versucht, für jede Top-Level-Funktion eine konkrete Instanz einer Typklasse zuzuweisen (dies erfolgt aus Leistungsgründen). Betrachten wir

example = return() 

Diese Funktion sollte Typ haben Monad m => m(), aber aufgrund der Monomorphismus Beschränkung gibt es nicht genügend Informationen über die Monade Instanz verwendet werden soll, so erhalten Sie die folgende Meldung

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

Jetzt wenn Sie bieten genügend Informationen für GHC ableiten, welche Instanz von Monad Sie verwenden, wie

example = return() 

main :: IO() 
main = example 

dann GHC die follo geben Flügel Typ

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

, da Sie es gesagt, dass example den gleichen Typ wie main

+2

Ist es nicht Banane = F.apple'? – Artyom

+0

@ArtyomKazak Ja ist es! – sabauma

+8

Seien Sie vorsichtig bei der Monomorphie-Einschränkung, wenn Sie dies tun, oder "Banane" kann mit einem restriktiveren Typ als "Apfel" enden. – hammar

7

haben Es gibt keine Syntax für das direkt. Vermutlich wollen Sie apple, einen Zusammenstoß mit einem lokal definierten zu vermeiden, so würde ich mit

import qualified Fruit (apple) 
banana = Fruit.apple