試しに次のソースをtest1.hsのような名前で保存して、GHCiに読み込ませてみよう。
haskellは名前にうるさいので、拡張子はちゃんと付けよう。
module Test where
x = 1
y = 2
f = x + y
g x = x + 3
h x y = x + y
Loading package base-1.0 ... linking ... done.
Prelude> Compiling Test ( ./mm.hs, interpreted )
Ok, modules loaded: Test.
*Test>
これでTestというモジュールが使えることになる。モジュールの名前は大文字で始めなくちゃいけないみたい。
whereはこのモジュールの中で次の関数が使えるようにするってことを表している、と思う。
Testの中にはx,y,f,g,hの5つの名前の関数を定義している。関数は小文字で始めなくちゃいけない。細かいね。
引数がなくても変数ではなくて、関数であるらしい。この話は後で詳しくしよう。
ひとまず、宣言した関数を呼び出してみる。
*Test> x
1
*Test> y
2
*Test> f
3
ここまではそのまま。
*Test> g
Top level:
No instance for (Show (a -> a))
arising from use of `[[print]]' at Top level
Probable fix: add an instance declaration for (Show (a -> a))
In a 'do' expression: print it
引数があるので、当然エラーになる。ちょっとエラー文を解析しよう。
適当に訳すとこんな感じ。
トップレベル:
(Show (a -> a))に対するインスタンスがない。
それはトップレベルでprintから発生する。
修正案:(Show (a -> a))に対するインスタンス宣言を加えたらどうだろう。
do表現の中にprint itのような感じで。
修正案が出るみたいだけど、この場合は的外れのようだね。
インスタンスは良く分からないけど、それが表示を行っているようだ。
で、printによってインスタンスが規定されているけど、この関数を表示させるインスタンスがなかった。
だからインスタンスを宣言してみたらどうかなってことだね。インスタンスはdoを使って書くらしい。
(Show (a -> a))の意味が良く分からないけど、それはまた後で調べよう。
今は、引数を与えて修正すればいい。
*Test> g x
4
*Test> g y
5
このxは最初に定義したxで、gの定義に使ったxではない。定義で使った引数は置き換えられるようだね。
*Test> h
Top level:
No instance for (Show (a -> a -> a))
arising from use of `print' at Top level
Probable fix: add an instance declaration for (Show (a -> a -> a))
In a 'do' expression: print it
おっと、またエラーにしちゃった。
ほとんど同じだけど、今度は(Show (a -> a -> a))になっている。
Showは大文字から始まるから関数じゃない。でも試した関数の形によって何か変わるみたいだ。
*Test> h x y
3
*Test> h 2 x
3
最終更新:2007年09月26日 05:04