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

大人のお型付け

909

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
909
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "大人のお型付け"

  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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×