2015-07-30 16 views
6

Próbuję nauczyć się Haskella z książki Learn You A Haskell for Great Good. Doszedłem do ostatniej sekcji rozdziału 7 (Moduły), gdzie mówi, jak stworzyć własny moduł. Zrobiłem kopię i wklejenie modułu Geometry podanego w książce na początku sekcji. Nazwą pliku jest Geometry.hs, jak sugerowała książka, a plik znajduje się w katalogu bin dla ghci, gdzie wcześniej udało mi się z powodzeniem wykonać ładowanie za pomocą: l dla innego pliku .hs.Jak mogę zaimportować moduł Haskell do GHCi?

Kiedy wpisz następujące polecenie w GHCi

import Geometry 

pojawia się następujący błąd:

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

muszę robić coś, co jest oczywiście złe, ale nie mogę dowiedzieć się, co to jest.

+0

Nie masz na myśli [rozdział 7] (http://learnyouahaskell.com/modules#making-our-own-modules)? – Zeta

+1

Byłem w stanie załadować zainstalowane moduły i moduły tylko z bieżącego katalogu roboczego ghci (jeśli jesteś w systemie Windows, możesz być w stanie uruchomić ':! Cd', aby znaleźć aktualny katalog roboczy ghci). – luqui

+0

Tak, zmieniłem pytanie na rozdział 7. Używam starszej wersji książki w formacie pdf i jest to rozdział 6 w tej wersji. Uruchomiłem:! Polecenie cd wskazuje na ten sam katalog, z którego korzystałem. – user1153980

Odpowiedz

4

Podczas korzystania import ModuleName w GHCi, to działa (w większości) w taki sam sposób import Data.List roboty budowlane: GHC sprawdza swoją lokalną bazę pakietów dla modułu, ładuje go i doprowadza do jego (wywożona) zawartość do zakresu.

Jednak Geometry nie jest modułem pakietu zainstalowanego z ghc-pkg. Dlatego GHC nie wie, że moduł w ogóle istnieje. Ani interaktywny wariant GHCi.

Ale jeśli masz program, rzeczy się zmieniają. GHC weźmie to pod uwagę wykorzystane moduły:

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

Jak widać, importowanie Foo pierwszy udało. Jednak po załadowaniu programu używającego Foo, mogliśmy użyć import Foo w GHCi.

Jeśli chcesz używać import w GHCi, upewnij się, że GHC może znaleźć Twój moduł, włączając go w opakowanie lub instalując. Jeśli chcesz tylko załadować sam moduł, użyj oad-:l.

+0

Dzięki wszystkim. Znalazłem problem. Plik pdf miał linię kodu, która ciągnęła się do następnego wiersza tekstu. Polecenie: l oad było o wiele bardziej pomocne w komunikacie o błędzie niż import. – user1153980

+1

Dziękuję za odpowiedź. Czy istnieje sposób na globalne powiadomienie ghc o module niestandardowym (aby nie trzeba było przechodzić do katalogu, w którym się znajduje)? – Chris

Powiązane problemy