GHCとmodule

GHCはmodule名と同じ名前のファイルからmoduleをimportしようとするのでファイル名とmodule名を合わせないといけない。Javaと似たような感じ。でも言語仕様なのかな?どの本にもはっきりとそう記述されてなかったから気になった。読み飛ばしただけかもしれないけど。

で、肝心のmoduleを含んだ複数のファイルをコンパイルする方法なんだけど、-iオプションで毎回module検索パスを追加してやる必要がある。カレントディレクトリは検索対象にならない。なので

$ ghc -i. --make mainのある.hs

みたいな感じにしてやると楽そう。

後階層型の名前を使うときはJavaと同様になる。名前とファイルの対応としては

Hoge.Hogehoge.HoGe  <-----> Hoge/Hogehoge/HoGe.hs

みたいな感じ。これは良い。俺はJava嫌いだけどこれはJavaの中でも好きな要素。

もう一つテストしてみたのがこんなケース。

Main.hs
Dir1/
     Module1.hs
     Dir2/
          Module2.hs

-- Main.hs
import Dir1.Module1

-- Module1.hs
module Dir1.Module1 where
import Dir1.Dir2.Module2

-- Module2.hs
module Dir1.Dir2.Module2 where

このように絶対指定することは可能だった。Module1.hsの中で

import Dir2.Module2

(この場合は
Dir1/
     Module1.hs
     Dir2/
          Module2.hs  ・・・(1)
Dir2/
     Module2.hs    ・・・(2)
(2)の方を参照してしまう。)

って出来るともの凄く素敵だったんだけど。Javaでも出来ないんだけど、こういう相対指定をできるようにするとどういう不都合があるんだろう?当然の事ながら

Dir1/
     Module1.hs
     Dir2/
          Module2.hs

-- Module1.hs
module Module1 where
import Dir2.Module2

-- Module2.hs
module Module2 where

なんて事をすると、Dir1.Module1を参照したときに名前がマッチしませんって怒られるし、Module2に関してはそもそも参照されることすらない。