2012-09-06 17 views
6

Soy un principiante en Haskell. Digamos que Rat es el tipo de fracciones de integer o un entero. Me gustaría preguntar, ¿por qué exporta esto los constructores de la Rata?Oculto constructor

module RatNum(Rat,add1Rat,makeRat) where 
    infixl 5 :/ 
    data Rat = Int :/ Int | Only Int deriving(Show) 
    add1Rat :: Rat -> Rat 
    add1Rat (a :/ b) = (a+b) :/ b 
    add1Rat (Only a) = Only (a+1) 
    makeRat :: Rat 
    makeRat = 1 :/ 1 
    makeORat :: Rat 
    makeORat = Only 1 

En GHCi:

Prelude> :l RatNum 
[1 of 1] Compiling RatNum   (RatNum.hs, interpreted) 
Ok, modules loaded: RatNum. 
*RatNum> Only 5 
Only 5 
*RatNum> add1Rat (1:/3) 
4 :/ 3 
*RatNum> 7:/5 
7 :/ 5 

El módulo no está terminado todavía y me gustaría ocultar los constructores de rata.

+0

Para el registro, lo que está haciendo está disponible en ['Data.Ratio'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio. html) módulo ya. –

Respuesta

12

Se debe a que está cargando el módulo desde ghci. Prueba este código, en un archivo Main.hs en el mismo directorio que RatNum.hs:

module Main where 

import RatNum 

f = Only 1 

Ahora intenta cargar Main de ghci:

$ ghci Main.hs 
GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 2] Compiling RatNum   (RatNum.hs, interpreted) 
[2 of 2] Compiling Main    (Main.hs, interpreted) 

Main.hs:5:5: Not in scope: data constructor `Only' 
Failed, modules loaded: RatNum. 

EXPLICACIÓN

un vistazo a this ghci manual page , sección 2.4.5. Explica que cada módulo que GHCI pone en su línea de comando se encuentra actualmente dentro del alcance; los identificadores visibles son exactamente los que serían visibles en un archivo fuente de Haskell sin declaración de importación (cite).

El símbolo del sistema indica RatNum porque le indicó a ghci que lo cargue, por lo que el mensaje funciona en el mismo ámbito que en ese módulo. En mi ejemplo, solo fue referenciado por el módulo que realmente cargué, Main, por lo que no ingresé en el alcance de RatNum.

Cuando realmente compile (o haga referencia a través de import s) su código, las declaraciones de exportación funcionarán como espera.

+0

Esto no puede cargar Main.hs y carga RatNum y los constructores están allí de nuevo. ¿O me estoy perdiendo algo? ¿Y de qué se trata este error? –

+0

Me refiero a este error Main.hs: 5: 5: No en el alcance: constructor de datos 'Solo ' –

+1

Ese es el punto. No funciona porque, como era de esperar, no puede acceder al constructor desde fuera de su módulo. –