かたのはなし	
2014-12-2
IMAMURA YUTAKA
TABLE OF CONTENTS	
1.  主張
2.  型について
3.  型のあるコード、型のないコード
4.  まとめ
型はドキュメント
である	
主張
一般的にそう考えられているらしい	
型はプログラムを読む際にも有用である。手続きの先頭やモジュール
インターフェイスの型宣言 はある種のドキュメントを構成し、振る舞い
を理解する有用なヒントになる。さらに、コンパイラ が実行されるたび
に検査されるので、コメント中に埋め込まれた記述とは違ってこのド
キュメント は古くなることがない。型の役割は、モジュールのシグネ
チャにおいて特に重要である。
ー 型システム入門 プログラミング言語と型の理論, Benjamin C.
Pierce
型はドキュメント、とは	
→	
型(Type)
ドキュメント(Document)
型はドキュメント、とは	
型が表す情報はとても多いです。	
プログラムに記述された型注釈をみると、そのプログラムの性質を把
握することもできます。
型はプログラムの性質を説明していると言えます。
コメントなどのドキュメントもまたプログラムの性質を説明します。
だから、型はドキュメントとしての役割もこなしている
といえます。
型について
型とは	
形のないものから、形を切り出すのが「型」
String	
 “これは文字列です”
×
×
=
=
ごちゃごちゃしたバイナリデータも Stringという型を与えると 文字列に変身
型がなければ	
この辺がたぶん次の
クッキーだと、思う	
そもそも何がどこにあって、何がどれなのか、整理できない	
0〜80bit目が文字列
だったような。。。
型はすでに使われている	
私たちはプログラムを整理するために型を使っている。	
String	
 osName	
 =“Windows”;	
 //	
 データは文字だと解る	
 
Integer	
 osVersion	
 =	
 8;	
 	
 	
 	
 	
 	
 //	
 データは数値だと解る	
 
	
 
型が明示されなければ	
osName	
 =	
 0x57696e646f7773	
 //	
 データは文字なのか?	
 
osVersion	
 =	
 0x8;	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 //	
 データは数値なのか?	
 
	
 
その変数(データ)が何を表しているのか、途端にわからなくなる。
文脈でその意味を推測できるかもしれない。できないかもしれない。
言語によって型の扱いは違う	
•  型が明示されている場合
1.  コード上で明確なデータ型の説明がされる
2.  その説明(つまり型)を常にコンパイラがチェックできる
n  これが「静的型付け言語」のポイント
•  型が明示されていない場合
1.  変数の名前からデータの性質を推論する
2.  処理系が実行時に型をチェックする(動かすまでわからない)
n  これが「動的型付け言語」のポイント
いくつかの
具体例	
型のあるコード、型のないコード
素数かどうかを調べる関数	
•  たとえば下記のような機能を持つ関数(メソッド)を考えてみる。
p 与えられた自然数が素数かどうかを判定する関数
•  この関数について、
•  型注釈がない場合の書き方と
•  型注釈がある場合の書き方
•  を比べてみてみる。
•  素数とは
•  1と自分自身以外では割り切れない数のこと
•  1, 2, 3, 5, 7, 11, 13 ….
型注釈のない定義(素朴なかんじ)	
動的型付け言語であるJavascriptならこういう書き方になる。
この定義(宣言)について何が言える?
•  素数の検査かな?	
•  パラメータは数値かな?	
•  たぶんBoolean(真偽値)が返る?
名前から推測することで、その性質はなんとなく予測できそう。	
	
function	
 isPrime(num)	
 
まあ、素数の検査の関数かどうかは、
事前の情報が与えられていない場合、
コメントから読み解くしかないですが。
型注釈のある定義	
静的型付き言語であるJavaならこういう書き方になる。
この定義(宣言)について何が言える?
•  素数の検査かな?	
•  パラメータは数値 (キリッ
•  返却値はboolean (キリッ
型注釈によって意味の曖昧な部分が減った。
キリッとした。
boolean	
 isPrime(Number	
 num)	
 
(`・ω・´)
さらに定義を進化させる	
問題は「与えられた自然数が素数かどうかを判定する関数」だったことを思い出そう。
この定義(宣言)について何が言える?
•  素数の検査かな?	
•  パラメータは自然数 (キリッ
•  返却値はboolean (キリッ
より問題を正確に記述できるようになった。
よりキリッとした。
//	
 自然数はNumber(数)に含まれるという定義	
 (便宜的)	
 
class	
 自然数	
 extends	
 Number	
 {}	
 
	
 
boolean	
 isPrime(自然数	
 num)	
 
(`・ω・´)
コンパイラによるチェック	
この関数の使い方について考えてみよう。
•  この関数に自然数を入力するとどうなるだろうか?
•  この関数に負数を入力するとどうなるだろうか?	
boolean	
 isPrime(自然数	
 num)	
 //	
 さっき見た定義な	
 
	
 
自然数	
 nat	
 =	
 11;	
 //	
 これは自然数の素数のはず	
 
Integer	
 negative	
 =	
 -11;	
 //	
 これは負の整数の素数のはず	
 
	
 
isPrime(nat)	
 //	
 true	
 
isPrime(negative)	
 //	
 コンパイルエラー	
 
問題を正確に型で表現できると、しょうもないエラーはどんどんコンパ
イラが見つけてくれるようになる。
まとめ
型が意味を説明してくれる	
型による注釈を使うと、関数が何するためのものなのか、解りやすくなる。
型が意味を説明してくれる。
これがつまり「型はドキュメントである」ということ。
さらにコンパイラはそのドキュメントをいつもレビューしてくれる。
型をきちんと定義してプログラムを書けば、もっとコメントは減らせる。
その上読みやすいコードにもなっていく。
もちろん動的型付けもいいよね	
JavascriptやPython、Rubyなどの動的型付け言語もいいと思いま
す。
ただ、開発者が増えたり、コードが肥大化してくると、静的型付けを求
める傾向が散見されたりはしますが。。。
•  Javascript: 静的型付けを持つAltJSの隆盛
•  Python: version 3くらいから型の注釈がオプションでついた
結論	
Haskellを使おう
•  純粋関数型言語
•  高度な型システム
•  圏論に基づく抽象化
•  もちろん静的型付け
おわり

かたのはなし