multiplicar - ¿Cuál es la sintaxis de Haskell para importar módulos en subdirectorios?
multiplos en haskell (2)
¿Cuál es la sintaxis de Haskell para importar módulos en otro directorio?
Estoy empezando con Haskell y quiero practicar la escritura de funciones simples al estilo TDD con HUnit. Sin embargo, estoy teniendo problemas para averiguar cómo estructurar mis archivos. El ejemplo que viene con HUnit parece ser una estructura de directorios plana.
Me gustaría tener mis pruebas y el código HUnit en una carpeta diferente a mi código real. Apreciaría un ejemplo rápido de declaración de importación y una sugerencia sobre cómo podría estructurar mis archivos.
Si importa, estoy usando GHCi y NotePad ++ para hacer mi codificación ahora mismo.
Realmente no lo haces desde el código fuente de Haskell; en cambio le dices al compilador donde mirar. El método habitual está en el archivo .cabal. Consulte la guía del usuario de Cabal para más detalles. Desea el parámetro "hs-source-dirs".
Alternativamente, puede pasar la ruta directamente al compilador. Sin embargo, Cabal es el mejor método.
Cada nombre de ruta en el parámetro "hs-source-dirs" especifica una raíz de una jerarquía de módulos. Básicamente, si importa un módulo llamado "Data.Foo.Bar", el compilador busca un archivo con el nombre de ruta relativo "Data / Foo / Bar.hs" en cada directorio dado por "hs-source-dirs" e importa el primero uno lo encuentra
La answer de Paul es acertada, pero solo quería ampliar la idea de pasar la ruta directamente al compilador para una solución rápida y fácil, principalmente para ejecutar scripts con runhaskell
o runghc
.
Todo lo que necesita hacer es pasar el indicador -i
al compilador con una lista de directorios delimitada por dos puntos. El compilador luego verificará esos directorios para los archivos de origen de los módulos importados.
Entonces, por ejemplo, si tiene una estructura de directorios así:
home/
|-- user/
|-- haskell/
|-- Module1.hs
|-- foo/
|-- Module2.hs
Y le gustaría que el Module2
pudiera importar el Module2.hs
Module1
, luego dentro del Module2.hs
agregue su declaración de importación como de costumbre:
import Module1
Luego, cuando ejecute Module2.hs
usando runhaskell
, lo ejecutaría así:
$ cd /home/user/haskell/foo
$ runhaskell -i/home/user/haskell Module2.hs
Referencia: http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/separate-compilation.html#search-path