ventajas vale una reservadas que puedo programacion permite pena palabras múltiples locales lenguaje hacer función estructuras español ejemplos desventajas dentro definiciones control con cláusula aprender haskell import

vale - ¿Por qué estos casos de esquina en la importación de Haskell, como el trabajo y qué hacen?



que puedo hacer con haskell (1)

He encontrado algunos módulos que contienen importaciones particularmente extrañas.

Antes que nada, he visto un módulo A que importa otro módulo como él mismo. Por ejemplo:

-- module A.hs module A where import B as A -- ??? f = id

¿Qué hace esto? ¿Por qué está permitido lo anterior?

Sin embargo, lo que más me preocupa es que el código es en realidad de este tipo:

module A where import B as A -- Okay, assume this works... import C as A -- ??? A is already defined! f = id

¿Por qué se puede importar más de un módulo con el mismo nombre? ¿Qué logra esto? Pensé que este tipo de import no estaban permitidas y también una introducción suave a Haskell establece que:

es ilegal importar dos entidades diferentes con el mismo nombre en el mismo ámbito.

Sin embargo, estas importaciones funcionan bien. Sin embargo, otra cosa extraña que me molesta es exportar el módulo en sí:

module A (module A) where

Para resumir, dado el siguiente MWE:

-- A.hs module A (module A) where import B as A import C as A f = id -- B.hs module B where g = id -- C.hs module C where h = id

  1. ¿Las importaciones siguen los estándares o es un error de GHC? No parece un error, pero no puedo encontrar ninguna referencia que explique todos estos casos de esquina.
  2. ¿Cuál es el resultado exacto logrado? Quiero decir: ¿qué nombres se importan y / o se exportan desde A ?

Los calificadores de nombres no son lo mismo que los nombres de los módulos. Un calificador de nombre es solo un alcance colectivo, puede hacer que se refiera a cualquier cantidad de módulos. Normalmente no agregará más de uno, pero en un caso casi siempre agrega muchos módulos: en el ámbito no calificado . import Data.List puede leerse como algo como import qualified Data.List as "" : arregla que, por ejemplo, sortBy se encontrará al referirse a él con un "calificador vacío", es decir, sin ninguno. Pero podríamos "cambiar el nombre" de ese alcance:

module Main where import qualified Prelude as P import qualified Data.List as P import qualified Data.Ord as P main :: P.IO () main = do -- `do` is syntax, not a name! P.print P.. P.map P.snd P.$ P.sortBy (P.comparing P.fst) [(4,''o''),(6,'' ''),(0,''H''),(1,''e''),(3,''l''),(9,''r''),(7,''W''),(10,''l''),(8,''o''),(2,''l''),(5,'',''),(11,''d''),(12,''!'')]

Los únicos calificadores que se arreglan son los específicos del módulo en su archivo: eso siempre está en el alcance no calificado, y en el alcance nombrado automáticamente después del módulo. Y para las definiciones , debe usar la forma no calificada.

Para el module A (module A) , eso parece bastante falso. No creo que las exportaciones de módulos estén realmente bien pensadas. Solo funcionan correctamente cuando se refiere a un módulo real, no solo a un calificador de nombre, es decir,

module PowerPrelude (module A) import qualified Prelude as A import qualified Data.List as A import qualified Data.Ord as A

no funcionará Lo que hace que te preguntes por qué está permitido declarar tal exportación en absoluto. De hecho, podría ser un error aquí.