大人のお型付け

1,184 views
1,074 views

Published on

CLR/H ナイトセミナー #2 ( http://atnd.org/events/36571 ) のTypeScriptのセッションで使用した資料です

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,184
On SlideShare
0
From Embeds
0
Number of Embeds
28
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

大人のお型付け

  1. 1. 大人のお型付けTypeScript + αの お話 Nobuhisa Koizumi
  2. 2. このセッションにはF# の話題が含まれている危険性があります
  3. 3. なぜK泉さんが ”TypeScript” なのか 自分でも良くわからない・・・
  4. 4. 2月1日のやり取り
  5. 5. 注意事項 TypeScript をよく知りません  間違いを含んでいる可能性があります  高度な質問は聞こえないフリをします
  6. 6. TypeScript (弱い)静的型付けJavaScript (ECMAScript) Open Source  http://typescript.codeplex.com/ > git clone https://git01.codeplex.com/typescript コンパイラ(tsc)がJavaScriptを生成
  7. 7. TypeScript – 個人的感想 – 意外と学習コストは大きい F#のほうが楽しい! JavaScriptよりは安全
  8. 8. “Type”Script すべての型は、プログラマのために・・・  “テスト”としての型  “ドキュメント”としての型
  9. 9. テストとしての型 3.14 + True / “A” 型の整合性に関するテストをコンパイラが代行  動的型付けの場合は自己責任 x+y/z
  10. 10. ドキュメントとしての型 (F#の例) fst : „a * „b -> „a 型は貴重な情報源  型からプログラムを予想できる „a -> („a -> „b) -> „b
  11. 11. お型付けの作法TypeScript の言語仕様を概観していきます
  12. 12. 変数var one: number = 1;var two: string = "two";var three = 3.0; // 型推論(number)var four: number; // Undefined Type
  13. 13. 関数の定義 function twice(x: number): number { return x * 2; } (x: number) => number function identity(x) { return x; }(x: any) => any
  14. 14. ちなみに F# だと ...let identity x = x val identity : ‘a -> ‘a
  15. 15. ラムダ式 (arrow function expression)// 従来var f0 = function (x: number) { return x * x; }var f1 = (x: number) => { return x * x }var f2 = (x: number) => x * x;
  16. 16. 高階関数の例function apply(f: (x: number) => number, x: number){ return f(x);}// F#let apply f x = f x
  17. 17. クラス定義class MyClass1 { public x: number; private y: number; constructor(x: number, y: number) { this.x = x; this.y = y; }}
  18. 18. クラス定義class MyClass2 { constructor(public x: number, private y: number){ }}
  19. 19. クラス定義class MyClass3 { public value: number = 0; private message = "fsharp"; // 型推論 public showMessage(): void { alert(this.message); } public getTwice() { // "() => number" に推論される return this.value * 2; }}
  20. 20. class ML { constructor(private message: string) { } public showMessage() { alert(this.message); } ド継} 承class OCaml extends ML { ・ constructor() { super("hello, OCaml"); } オ} ーclass FSharp extends OCaml { バ public showMessage() { alert("F#!F#!"); } // ※} ー ラfunction run() { var x: ML = new FSharp(); イ x.showMessage();}
  21. 21. オブジェクト型 無名。オブジェクト型リテラルによって仕様を記述できる。var o: { prop: number; func: () => void;};o = { prop: 10, func: () => alert("hello") };
  22. 22. インターフェイス!? オブジェクト型に名前を付けたものinterface Body { weight: number; height: number;}function calcBMI(x: Body) { var h = x.height / 100.0; return x.weight / (h * h);}
  23. 23. 構造的サブタイピング(構造的部分型) Structural Subtyping  構造的部分型と呼ばれることが多い 平たく言うと、静的Duck Typing C++, OCaml, Scala, F# などでも
  24. 24. interface Wolf { TypeScript howl: () => string;}function howl(x: Wolf) { alert(x.howl());}class WolfDog { public howl() { return "bowwow!"; }}var mrchildren = { howl: () => "HOWL!" } // λ...function start() { howl(new WolfDog()); howl(mrchildren);}
  25. 25. object Main { Scala type Wolf = { def howl(): Unit } def howl(x: Wolf) { println(x.howl()) } class WolfDog { def howl() = println("bowwow!") } class MrChildren { def howl() = println("HOWL!") } def main(args: Array[String]) { howl(new WolfDog()) howl(new MrChildren()) }}
  26. 26. let inline howl x = F# (^a : (member Howl : unit -> unit) x)type WolfDog() = // クラス member this.Howl() = printfn "bowwow!"type MrChildren = MrChildren // 判別共用体with member this.Howl() = printfn "HOWL!"let run () = howl <| WolfDog() howl MrChildren
  27. 27. モジュール定義 内部モジュール、外部モジュールの2つがあるmodule MyModule { // 内部モジュールの例 function myFunction1() { } export function myFunction2 { } class MyClass1 { } export class MyClass2 { }}
  28. 28. F# に似てるね!module MyModule = let private myFunction1 () = () let myFunction2 () = () type private MyClass1() = class end type MyClass2() = class end
  29. 29. リンク TypeScript クイックガイド (@KDKTN さん)  http://phyzkit.net/typescript/ 仕様書  http://go.microsoft.com/fwlink/?LinkId=267121 (.docx)  http://go.microsoft.com/fwlink/?LinkId=267238 (.pdf)
  30. 30. 大人のお型付けおしまい Nobuhisa Koizumi

×