2015-07-30 6 views
6

Sto cercando di insegnare a me stesso Haskell dal libro Learn You A Haskell for Great Good. Mi sono avvicinato all'ultima sezione del capitolo 7 (Moduli), dove racconta come creare il tuo modulo. Ho fatto una copia e incolla del modulo Geometria indicato nel libro all'inizio della sezione. Il nome del file è Geometry.hs, come suggerito dal libro, e il file si trova nella directory bin di ghci, che è il punto in cui precedentemente ero in grado di eseguire un carico utilizzando: l per un altro file .hs.Come posso importare un modulo Haskell in GHCi?

Quando ho digitare il seguente comando nel GHCi

import Geometry 

ottengo il seguente errore:

Could not find module 'Geometry' It is not a module in the current program or in any known package

io devo fare qualcosa che è ovviamente sbagliato, ma non riesco a capire cosa è.

+0

Non intendi [capitolo 7] (http://learnyouahaskell.com/modules#making-our-own-modules)? – Zeta

+1

Sono sempre stato in grado di caricare moduli e moduli installati dalla directory di lavoro corrente di ghci (se sei su Windows potresti forse essere in grado di eseguire ':! Cd' per trovare la directory di lavoro corrente di ghci). – luqui

+0

Sì, ho cambiato la domanda al capitolo 7. Ho usato una versione precedente del libro in formato PDF ed è il capitolo 6 in quella versione. Ho eseguito il:! comando cd e punta alla stessa directory che sto usando. – user1153980

risposta

4

Quando si utilizza import ModuleName in GHCi, funziona (principalmente) nello stesso modo import Data.List funziona: GHC controlla il database del pacchetto locale per il modulo, lo carica e ne porta il contenuto (esportato) nell'ambito.

Tuttavia, Geometry non è un modulo di un pacchetto installato con ghc-pkg. Pertanto, GHC non sa che esiste un modulo Geometry. Né la variante interattiva GHCi.

Ma se si :l oad un programma, le cose cambiano. GHC prenderà viene utilizzato moduli in considerazione:

-- Foo.hs 
module Foo where 

foo :: IO() 
foo = putStrLn "Hello from foo!" 
-- Main.hs 
module Main where 
import Foo (foo) 

main :: IO() 
main = foo 
$ cd /path/to/your/files 
$ ghci 
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help 
Prelude> import Foo 

<no location info>: 
    Could not find module ‘Foo’ 
    It is not a module in the current program, or in any known package. 

Prelude> :l Main.hs 
[1 of 2] Compiling Foo    (Foo.hs, interpreted) 
[2 of 2] Compiling Main    (Main.hs, interpreted) 
Ok, modules loaded: Main, Foo. 
*Main> :l Main.hs 
*Main> foo 
Hello from foo! 
*Main> import Foo 
*Main Foo> -- module now loaded

Come si può vedere, l'importazione Foo prima fallito. Tuttavia, dopo aver effettivamente caricato il programma che utilizza Foo, siamo stati in grado di utilizzare import Foo in GHCi.

Quindi, se si desidera utilizzare import in GHCi, accertarsi che GHC possa trovare il modulo, includendolo in un wrapper o installandolo. Se si desidera caricare il modulo stesso, utilizzare :l oad.

+0

Grazie a tutti. Ho trovato il problema. Il file pdf aveva una riga di codice che continuava nella riga successiva del testo. Il comando: l oad è stato molto più utile con il suo messaggio di errore dell'importazione. – user1153980

+1

Grazie per la risposta. C'è un modo per rendere ghc globalmente consapevole di un modulo personalizzato (quindi non è necessario navigare nella directory in cui vive)? – Chris