SlideShare a Scribd company logo
1 of 22
Download to read offline
かたのはなし	
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を使おう
•  純粋関数型言語
•  高度な型システム
•  圏論に基づく抽象化
•  もちろん静的型付け
おわり

More Related Content

Viewers also liked

TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部Masahiro Wakame
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツShunji Konishi
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
オブジェクト指向設計の原則
オブジェクト指向設計の原則オブジェクト指向設計の原則
オブジェクト指向設計の原則Toru Koido
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 

Viewers also liked (6)

TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツ
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
オブジェクト指向設計の原則
オブジェクト指向設計の原則オブジェクト指向設計の原則
オブジェクト指向設計の原則
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 

Similar to かたのはなし

[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PEN[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PENRyota Nakamura
 
Japanese for it bridge engineers
Japanese for it bridge engineersJapanese for it bridge engineers
Japanese for it bridge engineersVu Hung Nguyen
 
TAPL 勉強会(紹介編)
TAPL 勉強会(紹介編)TAPL 勉強会(紹介編)
TAPL 勉強会(紹介編)none_toka
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)none_toka
 
TypeScript で型を上手く使う試み.pdf
TypeScript で型を上手く使う試み.pdfTypeScript で型を上手く使う試み.pdf
TypeScript で型を上手く使う試み.pdfRyo Higashigawa
 
みんなのPython勉強会#62
みんなのPython勉強会#62みんなのPython勉強会#62
みんなのPython勉強会#62hiroya akita
 
大人の基礎C#【Niigat.NET 2015-10】
大人の基礎C#【Niigat.NET 2015-10】大人の基礎C#【Niigat.NET 2015-10】
大人の基礎C#【Niigat.NET 2015-10】Mitsuhito Ishino
 

Similar to かたのはなし (8)

[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PEN[CE81] プログラミング入門教育用学習環境PEN
[CE81] プログラミング入門教育用学習環境PEN
 
Japanese for it bridge engineers
Japanese for it bridge engineersJapanese for it bridge engineers
Japanese for it bridge engineers
 
TAPL 勉強会(紹介編)
TAPL 勉強会(紹介編)TAPL 勉強会(紹介編)
TAPL 勉強会(紹介編)
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)
 
TypeScript で型を上手く使う試み.pdf
TypeScript で型を上手く使う試み.pdfTypeScript で型を上手く使う試み.pdf
TypeScript で型を上手く使う試み.pdf
 
みんなのPython勉強会#62
みんなのPython勉強会#62みんなのPython勉強会#62
みんなのPython勉強会#62
 
大人の基礎C#【Niigat.NET 2015-10】
大人の基礎C#【Niigat.NET 2015-10】大人の基礎C#【Niigat.NET 2015-10】
大人の基礎C#【Niigat.NET 2015-10】
 

かたのはなし