型とクラス

さて、Showが何か分からないので調べてみよう。
とはいえ、Hoogleの説明はまだ良く分からない。GHCiを使って調べよう。

GHCiは:?でhelpを出してくれる。で、どうすればいいかな? ……日本語訳を見ようw

:info [<name> ...] 指定された名前についての情報を表示する

これを使おう。ここには書いてないけど、:iでも使えるね。
簡単なものを試してみよう。

*Test> :i x
x :: Integer 	-- Defined at ./mm.hs:6:0

::は型を表すのに使う。xはInteger型だと言ってる。
(--)は一行コメントだ。Integerはとりあえず整数だと思っておこう。

じゃあ、Showを調べてみる。

*Test> :i Show

何か長々と表示されてしまった。まあ、少し読んでみよう。

class Show a where

Show aというのはクラスだ! クラスって何とか、aって何とは思うけど。
whereは、続く関数はその中で使われることを示しているんだった。

 showsPrec :: Int -> a -> ShowS
 show :: a -> String
 showList :: [a] -> ShowS

だから、これらの関数はShowに属するものだ。クラスメソッドっていうのかな?
  • >は関数そのものを表す。
一番目、showsPrecは(Int -> a -> ShowS)という型であると言っているんだ。
右側の形は見たことがあるね。(a -> a -> a)これと同じ。hの情報を見てみよう!

*Test> :i h
h :: Num a => a -> a -> a
  	-- Defined ./mm.hs:4:0

また新しい記号が(ぉ
(Num a =>)これについてはスーパークラスで説明するので、今は保留。
h x y = x + yという形をしているから、最初の2つが引数、最後の1つが関数の値のようだ。
全部->で繋がっているのは、

h a -> a -> a
h a a -> a

ということも表しているかららしい。これも後で調べよう。
aは何でも入る型だ。でも、hではNum a =>で制約されているってことなんだろう。

Showに戻って、

instance Show Float 	-- Imported from GHC.Float
instance Show Double 	-- Imported from GHC.Float
     :
     :

instanceは、どうも型を指定してるみたい。
これは関数ではなくて、クラスに含まれるデータのことを示してるんだね。
オブジェクト指向ではよく使う言葉なのか。

とりあえず今回はここまで。次はスーパークラスについて書かなくちゃいけないかな。

タグ:

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