2012-09-29 10 views
17

En Haskell, escribo import Fruit o import Fruit (apple) y puedo acceder a apple o Fruit.apple.Función de importación con un alias en Haskell

En Python, puedo escribir from Fruit import apple para apple o import Fruit para Fruit.apple.

Creo que también puede escribir import Fruit.apple as banana en Python para hacer referencia a la misma función que banana.

¿Cómo, en Haskell puedo hacer esto? import Fruit as Vegetable en cualquier idioma puede cambiar el nombre de Fruta, pero quiero cambiar el nombre de manzana.

+0

Para su información, estoy en particular, en este momento tratando de importar Data.List.genericLength como la longitud de conseguir deshacerse de Int sin refactorización. –

+0

Me pregunto qué fácil o difícil sería parchar GHC para aceptar la siguiente sintaxis: 'import Fruit (apple as banana)'. – Wizek

Respuesta

17

Esta es una propiedad agradable que Python tiene porque sus "diccionarios hasta el fondo", por así decirlo. Haskell le permite asignar alias a los módulos, pero no hay forma de alias de las funciones de la declaración import (hasta donde yo sé). Lo mejor que podrías hacer es

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

se puede poner esto en su propio módulo y exportar los valores que desee, ocultando los detalles de todo esto, pero que parece como un montón de trabajo para algo tan sencillo .

Como se comenta a continuación por hammar, la restricción de monomorfismo podría causar problemas con el tipo inferido de banana. Para estar seguro, usted debe anotar ya sea banana con su tipo deseado (probablemente la de apple), o desactivar la restricción monomorphism como

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

De lo contrario, el tipo inferido de banana podría ser menos polimórficos que se desee.

La restricción de monomorfismo intenta asignar una instancia concreta de una clase de tipo para cada función de nivel superior (esto se hace por motivos de rendimiento). Considere,

example = return() 

Esta función debe tener el tipo Monad m => m(), pero debido a la restricción monomorphism, no hay suficiente información sobre qué instancia Mónada se debe utilizar, para que pueda obtener el siguiente mensaje

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

Ahora , si se proporciona suficiente información para GHC para inferir qué instancia de Monad que está utilizando, tales como

example = return() 

main :: IO() 
main = example 

continuación GHC dará el Follo ala tipo

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

ya que dijo que example que tendrá el mismo tipo que main

+2

¿No es 'banana = F.apple'? – Artyom

+0

@ArtyomKazak ¡Sí lo es! – sabauma

+8

Tenga cuidado con la restricción de monomorfismo al hacer esto, sin embargo, o 'banana' puede terminar con un tipo más restrictivo que' apple'. – hammar

7

No hay sintaxis para que directa. Es de suponer que se quiere evitar un choque con un localmente definidas apple, por lo que me gustaría ir con

import qualified Fruit (apple) 
banana = Fruit.apple 
Cuestiones relacionadas