関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。引用もしていますし、感想なども混ぜています。
本節は型についてです。強い型付けがよくわからなくて悩みました。
内容は
- 型の基本と強い型付け
- 多相型
- 型クラス
といった感じです
型の基本と強い型付け
値は型という集まりに分類することができて、様々な型があります。 Int
, Float
, Integer
,リスト…などなど。
既存の型を組合せて新しい型も作れます。 (Int, Int)
, Int -> Int
型固有に演算があり、違う型に利用することは無意味です。意味がないので不当な式となります。
式であれば、必ず型があり、その型は式を構成する要素から推論できます。構成要素から型が決定できるので強い型付けになるようです。(ここがはっきりしなくて悩んだ) 弱い型つけの場合は暗黙のキャストなどにより実行してみないとわからない部分があるようです。
強い型付けの利点は
- つづりミスや混乱した定義をコンパイル時点で発見できる
- プログラムを書く際のルールになる
だそうです。
引数や結果の型を考えることで型レベルの整合性を保ち、その中で値をやりくりするので、型の枠から外れることも防ぐことができて、明瞭なプログラム設計ができるようです。
多相型
式の型は 構成要素から決定できますが、関数合成や和や積などは複数の型に対して利用できているように見えます。これは型変数を利用することでこのような定義ができます。
「それって強い型付けなの?」という疑問に教われるのですが、型変数を含んでいても型なので問題がないようです。 曖昧であれば不正な式になるのだと思います。その場合は推論に任せず型指定をすることになります。
このように型変数を含む型を多相型と呼びます。
おまけで (->) は 型演算子 だそうで、右結合だそうです。Int -> Int
は ->
で演算して新しい型を作るとも言えます。
型式というものがありそうですが説明されてません。
型クラス
和や積をするつあめの (+)
, (*)
がありますがこれを型変数で定義するには一般的すぎます。数値であるようなものであれば扱えて欲しい。
そのような似た型をまとめる型クラスという機能があります。型変数に制約をつけることができます。数値であるような型は Num クラスのインスタンスとなります。
Num a => a -> a -> a
とかいたとき
a がNumクラスのインスタンスであるという制約のもとで、 a -> a -> a
と、読みます。
数値以外の型クラスに 値が表示可能な型クラス(Show) 相等性検査可能な型クラス(Eq) 列挙可能な型(Enum) などなど様々なクラスがあります。(モナドとか)
ある型は複数の型クラスのインスタンスになれます。 なんだかレイヤーがひとつ違う感じですね。
練習問題
lhs 形式を選択したのですが、あまり意味がありませんでした。
lhs 形式は地の文がコメントになり >
ではじまる部分がHaskellのコードになります。
まとめ
型システムへの理解不足で難しかったです。 なんとなくで理解していたところだいぶすっきりすることができました。
型を意識することで、他のプログラミング言語を利用する場合にも明瞭な設計ができると思います。