前節で、5という数値に対して奇妙な型定義をしなければならないことがわかった。型クラスについて深く掘り下げて調べる前に少し話を戻し、そもそも型クラスを導入することになった動機について少し考察しよう。
多くの言語 (C++、Javaなど) で、オーバーロードという仕組みが存在する。つまり、さまざまなパラメータ型をとるように、関数を記述することができる仕組みだ。たとえば、同値関数がそのよい例だ。2つの整数を比較する場合は整数の比較関数を使用する必要がある。2つの浮動小数点数を比較する場合は浮動小数点数の比較関数を使用する必要がある。2つの文字を比較する場合は文字の比較関数を使用する必要がある。一般に、型αのもの同士を比較する場合は、型αの比較関数が必要になるのだ。このαは型を値とする変数なので、型変数と呼んでいる。
■注■ 型変数には、ギリシャ文字の最初のほうの文字、α、β、γ、δ... を使うのがふつうである。
ところがこれは、静的型チェックにとっては都合が悪い。というのも、ある処理 (たとえば同値テスト) がどの型のためのものか、型チェック機能にはわからないからだ。この問題の解決策は、静的型言語ごとにすべて異なる (これは少し大げさかもしれないが、そう外れてもいないだろう)。Haskell が選んだのは型クラスという仕組みである。これが正しくて最良の解決策かどうかは、もちろん利用分野によって異なる。しかし、Haskell がこの方法を採用している以上、これに親しむにはどうすればよいかを考えるべきだろう。
同値テストの問題に戻ろう。やりたいことは、2つの同じ型 (αとする) を持つパラメータをとり、booleanを返す演算子
== (同値演算子) を定義することである。しかし、この関数はあらゆる型に対して定義することはできず、定義できる型は限られている。そこで、この関数 == を型クラスに対応付けし、その型クラスを Eq と呼ぶことにする。もし、特定の型αが、ある型クラスに属する (つまり、そのクラスに関連づけられている関数は、すべてαに対して実装されている) ならば、αはそのクラスのインスタンスであるという。たとえば、等号は整数に対して定義されているので、Int は Eq のインスタンスである。==のような演算子のオーバーロード以外に、Haskell には定数のオーバーロード (たとえば、1, 2, 3, など) がある。この仕組みにより、たとえば、5 のような数値を入力した場合、コンパイラは適切と思われるものに応じて、整数とも浮動小数点型の数とも解釈できるようになる。クラス Num は、このような数値すべてと、最低限の演算子 (たとば、加算など) を含むものとして定義される。基本的な数値型 (Int、Double) は、Num のインスタンスとして定義される。ここでは、型クラスの威力 (と複雑さ) を、表面的にさっと触れるにとどめる。型クラスについては、8.4節で詳しく述べるが、その前にその背景についてもっと知っておく必要がある。その前に、関数についてもう少し述べる必要がある。
Haskell のもう1つの標準的なクラスは Show である。クラス Show のメンバーの型には、その型の値を文字列に変換する関数がある。この関数を
show と言う。たとえば、整数 5 に show を適用すると文字列 "5" になり、文字 'a' に show を適用すると 3 文字の文字列 "'a'" になる (最初と最後の文字は、アポストロフィ)。文字列に show を適用すると、文字列が引用符でくくられるだけだ。これは、インタープリタで試すことができる。Prelude> show 5
"5"
Prelude> show 'a'
"'a'"
Prelude> show "Hello World"
"\"Hello World\""■注■最後の行にバックスラッシュが表示されているのは、内側の引用符がエスケープされているからである。つまり、内側の引用符は文字列の一部であり、インタープリタが値を出力する引用符ではないことを意味する。実際の文字列に、バックスラッシュは含まれない。
Show のインスタンスではない型もある (たとえば関数)。関数 (
sqrt など) を show しようとすると、コンパイラまたはインタープリタは、インスタンスの定義が存在しないかクラス制約が不正である、という謎めいたエラーメッセージを出力するだろう。前ページ「4.2 多相型」
次ページ「4.4 関数型」
1 はじめに
2 スタートガイド
4 型の基礎
5 Basic Input/Output
6 Modules
7 Advanced Features
8 Advanced Types
9 Monads
10 Advanced Techniques
A Brief Complexity Theory
B Recursion and Induction
C Solutions To Exercises
これは、Haskell (ハスケル) のチュートリアル "Yet Another Haskell Tutorial" を日本語に翻訳したものです。
オリジナルのドキュメントは、
http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf
などから入手できます。
日本語訳に関するご指摘は、コメントとしてお寄せください。
オリジナルのドキュメントは、
http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf
などから入手できます。
日本語訳に関するご指摘は、コメントとしてお寄せください。
【Yet Another Haskell Tutorialの最新記事】

