組み込まれている型には、Int (正負両方の整数)、Char (文字)、String (文字列) など多数ある。Char型に属する式についてはすでに見たので、String型に属する式を調べてみよう。
Prelude> :t "Hello"
"Hello" :: Stringもっと複雑な式を入力することもできる。たとえば、同値であることを調べてみよう。
Prelude> :t 'a' == 'b'
'a' == 'b' :: Boolこの式が偽であっても、ある型、すなわちBool型を持つことに注意が必要である。
■注■ Bool は Boolean (通常は "ブーリアン" と読むが、1度か2度 "ブーリーン" と言うのを聞いたことがある) の短縮形で、取り得る値は
True または False のどちらかである。型に誤りのある式の型をシェルに出力させれば、型チェックや型推論がどのように処理されるか観察できる。たとえば、等号は2つの引数の型は同じ型に属する必要がある。文字と文字列を比較させようとすれば、CharとStringが異なる型であることがわかる。
Prelude> :t 'a' == "a"
ERROR - Type error in application
*** Expression : 'a' == "a"
*** Term : 'a'
*** Type : Char
*** Does not match : [Char]エラーの1行目 ("Expression" と書かれている行) は、型エラーが起きている式を教えている。2行目は、この式のどの部分の型が正しくないかを示している。3行目はこの項がどの型に推論されたかを示し、4行目はどの型に一致する必要があったかを示している。この場合は、Char型が[Char]型 (文字のリスト。Haskellの文字列は文字のリストとして表現される) に一致していないと言っている。
前述のように、
:: 演算子を使えば式の型を明示的に指定できる。たとえば、上の例で "a" と書く代わりに ("a"::String) と書くこともできた。この場合、"a" には1とおりの解釈しか存在しないため何も変化しない。しかし、数値の場合を考えてみよう。以下を試してほしい。Prelude> :t 5 :: Int
5 :: Int
Prelude> :t 5 :: Double
5 :: Doubleこのように、数値5はInt、Doubleのどちらにインスタンス化させることもできることがわかる。型を指定しないとどうなるだろうか?
Prelude> :t 5
5 :: Num a => a予想と違っていたのではないだろうか? 手短に説明すると、これが意味するのは、ある型 a がクラス Num のインスタンスなら、式 5 の型は型 a に属するということである。もし意味がわからなくても、今はかまわない。第4.3節で型クラス (ここで述べているもの) について広範囲に論じる。この読み方だが、「Num のインスタンスである a が a を実装している」となる。
演習
演習 4.1 以下の式を自分で計算し、もしそれが型を持つならその型を確かめよ。また、式が型エラーであるかどうか注意せよ。
1.
2.
3.
4.
5.
'h':'e':'l':'l':'o':[]2.
[5,'a']3.
(5,'a')4.
(5::Int) + 105.
(5::Int) + (10::Double)前ページ「4 型の基礎」
次ページ「4.2 多相型」
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の最新記事】

