2013-10-09 12 views
5

Mein Verständnis ist, dass die gepunktete Syntax von Modulen in Haskell die logische Struktur auf der Festplatte darstellt. Also, wenn wir haben eine Struktur wie folgt aus:Angeben der Baumstruktur Haskell-Module

Main.hs 
Foo/ 
    Bar.hs -- exports "Bar" 
    Quux.hs -- exports "Quux" 

... dann in unserem Main.hs, was wir tun können:

import Foo.Bar 
import Foo.Quux 

(Ich gehe davon aus wir nur Module an Blattknoten des Dateisystems haben kann Zum Beispiel können wir in dem obigen Fall kein Foo Modul haben.)

In diesem Beispiel durchlaufen wir den Baum. Was passiert, wenn wir hochgehen wollen?

lib/ 
    SomeModule.hs 
    XYZ.hs 
src/ 
    Main.hs 

Das heißt, in Main.hs, wie wir importieren SomeModule oder XYZ?

Vielleicht wäre dies nicht üblich mit Main, aber was ist mit Inter-Modul-Abhängigkeiten? Sie könnten berechtigt sein, auf "Cousin" -Knoten Bezug zu nehmen.

+3

Es ist sehr üblich, Module in "Filialen" zu haben - nur z.B. Erstellen Sie '' 'Foo.hs''' im selben Verzeichnis wie Ihr' '' Foo/'' 'Verzeichnis – amindfv

+1

Genau gesagt: Die punktierte Syntax der Module repräsentiert die logische Struktur auf der Festplatte * in GHC *. Der Bericht selbst gibt keinen Hinweis darauf, wie Module überhaupt auf der Festplatte gespeichert sind, und eine konkurrierende Implementierung könnte andere Dinge tun - eine Manifest-Datei haben, eine Datenbank verwenden, Dinge in der Cloud speichern ... –

Antwort

7

Verwenden Sie einfach den vollständig qualifizierten Namen des Moduls und teilen Sie GHC mit, wo das Stammverzeichnis der Modulhierarchie mit der Option -i zu finden ist. In Ihrem Beispiel bedeutet dies, dass Sie import XYZ in Main.hs verwenden müssen, um das Modul und den Befehl ghc -i../src --make Main.hs zu importieren, um Ihr Programm zu kompilieren. Wenn Sie gegenseitig rekursive Module kompilieren müssen, sehen Sie sich this section des GHC-Handbuchs an.

Wenn Sie Cabal verwenden, um Ihr Paket zu erstellen, können Sie die Module unter lib in einer Bibliothek gruppieren und dann diese Bibliothek zu einer Abhängigkeit von Ihrer ausführbaren Datei machen. Sie werden die folgende Verzeichnisstruktur haben:

some-package.cabal 
lib/ 
    XYZ.hs 
src/ 
    Main.hs 

Die relevanten Teile der some-package.cabal Datei wird wie folgt aussehen:

Name: some-package 
Version: 1.0 
... 
Library 
    ... 
    Exposed-modules: XYZ 
    Hs-source-dirs: lib 
    ... 
Executable some-executable 
    ... 
    build-depends: some-package == 1.0 
    ... 
... 

Dies ist besonders nützlich, wenn Ihr Paket einen Test oder eine Benchmark-Suite enthält, weil die Module unter lib werden nur einmal kompiliert.

Hier ist a real-life example dieser Technik.