13. よくある比較の例
架空の静的型付け言語の変数宣言
// 文字列型の変数 s を"hoge"で初期化
String s = "hoge";
// 日付型の変数 d を現在日時で初期化
Date d = new Date();
架空の動的型付け言語の変数宣言
// 変数 s を"hoge"で初期化
var s = "hoge";
// 変数 d を現在日時で初期化
var d = new Date();
これで「静的型付け言語は冗長だ!」となるのは
悲しい
型推論!
14. 簡単な型推論
架空の静的型付け言語の変数宣言
// 文字列型の変数 s を"hoge"で初期化
String s = "hoge";
// 日付型の変数 d を現在日時で初期化
Date d = new Date();
=の右側が分かれば、左側の型って自明じゃね?
→静的型付け言語なら右側の型は分かる
→じゃぁ書かなくていいじゃん!
架空の簡単な型推論付静的型付け言語の変数宣言
// 変数 s を"hoge"で初期化 (変数の型は文字列)
var s = "hoge";
// 変数 d を現在日時で初期化 (変数の型は日付)
var d = new Date();
16. 同じや!
架空の動的型付け言語の変数宣言
// 変数 s を"hoge"で初期化
var s = "hoge";
// 変数 d を現在日時で初期化
var d = new Date();
架空の簡単な型推論付静的型付け言語の変数宣言
// 変数 s を"hoge"で初期化 (変数の型は文字列)
var s = "hoge";
// 変数 d を現在日時で初期化 (変数の型は日付)
var d = new Date();
17. どんなものが来ても推論できるの?
var i = 42; // i は数値型
var xs = [1, 2, 3]; // xs は数値の配列型
// f: Regex[] を返すなら、x は Regex 型
var x = f("hoge")[2];
// g は文字列を受け取って Regex の配列を返す関数
var g = f;
var h = function(a) { return a + 1; };
// JSX : コンパイルエラー
// TypeScript : any を受け取り any を返す関数
// Haxe : Int を受け取り Int を返す関数
Haxe 素敵。TypeScript は any に落ちる。JSX は型
推論自体が後付けなので残念。
ちなみに・ ・
・
18. 関数式 (ラムダ式)
JS
var f = function(i) { return i + 1 }
これを Haxe / JSX / TypeScript で書くと・
・・
Haxe
var f = function(i) return i + 1;
JSX
var f = (i: int): int -> i + 1;
TypeScript
var f = (i: number) => i + 1
TypeScript が一番短く書けました
27. JS でのダックタイピング
x と y さえあればいい
function f(point) {
var x = point.x;
var y = point.y;
// なにか素敵な処理
}
var p1 = { x: 10, y: 20 };
var p2 = new (function() {
this.x = 1;
this.y = 2;
})();
JSX / Haxe / TypeScript でどうやるのかを見てい
きます。
28. JSX の場合:template
JSX は template を使います。
template
function f.<T>(point: T): 戻り値の型 {
var x = point.x;
var y = point.y;
// なにか素敵な処理
}
var p = { x: 10, y: 20 }; // うっ・ ・・
class Point {
var x: number;
var y: number;
function constructor(x: number, y: number) {
this.x = x; this.y = y;
}
}
が、現行バージョンではユーザは関数テンプレー
トが使えません・
・・駄目じゃん
29. Haxe の場合:構造的部分型
Haxe では、構造的部分型を使います。
構造的部分型 (Haxe)
function f(point: { x: Int, y: Int }) {
var x = point.x;
var y = point.y;
// なにか素敵な処理
}
var p = { x: 10, y: 20 };
class Point {
public var x: Int;
public var y: Int;
public function new(x, y) {
this.x = x; this.y = y;
}
}
30. TS の場合:構造的部分型
TypeScript でも、構造的部分型を使います。
構造的部分型 (TypeScript)
function f(point: { x: number; y: number; }) {
var x = point.x;
var y = point.y;
// なにか素敵な処理
}
var p = { x: 10, y: 20 };
class Point {
constructor(public x: number, public y: number) { }
}
短い!
35. JSX の場合:クラス階層
abstract class Card {
abstract function toNum(): number;
}
class Num extends Card {
var num: number;
function constructor(n: number) {
this.num = n;
}
override function toNum(): number { return this.num; }
}
class Jack extends Card {
static var _instance = new Jack();
static function getInstance(): Jack { return Jack._instance; }
override function toNum(): number { return 11; }
}
class Queen extends Card {
static var _instance = new Queen();
static function getInstance(): Queen { return Queen._instance; }
override function toNum(): number { return 12; }
}
class King extends Card {
static var _instance = new King();
static function getInstance(): King { return King._instance; }
override function toNum(): number { return 13; }
}
長い!
39. 例えばさっき書いたこの処理
カードの数値化 (再掲)
function toInt(c)
return switch (c) {
case num(n): n; // !
case jack: 11;
case queen: 12;
case king: 13;
}
joker の場合の処理が書かれてないです。
こんな感じの関数がすでにいたるところで書かれ
ている・ ・・
40. パターンの網羅性チェック
でも、Haxe の enum ならパターンの網羅性チェッ
クがあるので、全ての場所でコンパイルエラーと
なります。
パターンが網羅性がチェ ックされる
function toInt(c)
// Some constructors are not matched: joker
return switch (c) {
case num(n): n;
case jack: 11;
case queen: 12;
case king: 13;
}
あとはコンパイルエラーをつぶしていくだけ!
安心!
42. JS との比較
JavaScript
function idxOf(str, target) {
switch (target.constructor.name) {
case ’String’: // target が文字列の場合の実装
case ’RegExp’: // target が正規表現の場合の実装
}
}
Haxe
function idxOf(s, target)
return switch(target) {
case str(x): // target が文字列の場合の実装
case regex(x): // target が正規表現の場合の実装
}
Haxe 版は、target に数値などを渡すとコンパイル
エラーになってくれる!
43. TypeScript の場合:enum?
We expect the final language to
support enum types, but not in the form
they are currently implemented.
「最終的な言語には enum のせたいけど、今はま
だないよ」
とのことなので、Haxe の enumっぽいものがのる
ことをみんなで祈りましょう。