基本的なソース

試しに次のソースを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

これも大体同じ。引数はいくつでも大丈夫だね。
次は型とクラスについて説明するよ。ここで(Show (a -> a -> a))の意味が分かるようにするよ。
順番が適当だから、普通の順番がいい人は本物のプログラマはHaskellを使う:ITproでもどうぞ。

タグ:

+ タグ編集
  • タグ:
最終更新:2007年09月26日 05:04