大人のお型付け
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

大人のお型付け

  • 1,185 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,185
On Slideshare
1,179
From Embeds
6
Number of Embeds
2

Actions

Shares
Downloads
1
Comments
0
Likes
1

Embeds 6

https://twitter.com 4
http://d.hatena.ne.jp 2

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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