$30 off During Our Annual Pro Sale. View Details »

Rubyistのための型入門

mzp
March 28, 2015

 Rubyistのための型入門

浜松Ruby会議01 http://regional.rubykaigi.org/hamamatsu01/ の発表資料です。

http://mzp.hatenablog.com/entry/2015/03/29/213909 もあわせてご覧ください。

mzp

March 28, 2015
Tweet

More Decks by mzp

Other Decks in Technology

Transcript

  1. mzp
    RubyistͷͨΊͷ
    ܕೖ໳

    View Slide

  2. ࣗݾ঺հ
    • Twitter/Github: mzp
    • ໊ݹ԰͔Βདྷ·ͨ͠
    • ͓࢓ࣄͰ͸RailsΛॻ͍͍ͯ·͢
    • OCamlͱ͔ͷܕͷڧ͍ݴޠ͕޷͖Ͱ͢

    View Slide

  3. એ఻
    Ϋϥ΢υ੥ٻ؅ཧαʔϏεMisoca
    ʮࣄۀऀؒͷऔҾΛ࠷దԽ͢Δʯ

    View Slide

  4. ໊ݹ԰Rubyձٞ02

    View Slide

  5. Rubyͱͷग़ձ͍
    • େֶ1೥ͷͱ͖ʹ࢖͍͸
    ͡Ίͨɻ
    • ΋͏10೥ͨͬͯΔ…
    • ઌഐʹPerlΛקΊΒΕͨ
    ͷ͕͖͔͚ͬ
    ↓͜ΕಡΜͩ

    View Slide

  6. LLશ੝ظ
    • ౰࣌͸LL(Lightweight Language)ͱͯ͠ɺ·ͱΊͯޠ
    ΒΕ͍ͯͨɻ
    • Pݴޠ(Perl, Python, PHP, Ruby)Έ͍ͨͳݴ༿΋͋ͬͨ
    http://magazine.rubyist.net/?0016-LLRingReport
    ※ݸਓͷײ૝Ͱ͢

    View Slide

  7. ੩తܕ෇͖ݴޠͱͷൺֱ
    • Java/C++ͱ͍ͬͨ੩తܕ෇͖ݴޠͱൺֱ͞Εͯͨ
    • Ұ෦ͷਓ͸disͬͯͨ
    • ࢓ࣄͰ͸JavaɺझຯͰLLɺΈ͍ͨͳਓ͕ଟ͔ͬͨ
    ※ݸਓͷײ૝Ͱ͢

    View Slide

  8. ͦΕ͔Β10೥…
    • LLͰ࢓ࣄ͢Δͷ͸௝͍͠࿩Ͱ͸ͳ͘ͳͬͨ
    • Scala, Swift, F#, Go, TypeScript ͳͲ৽͍͠੩తܕ෇
    ͖ݴޠ΋ొ৔͍ͯ͠Δ
    • ੩తܕ෇͖ݴޠ͕ͳͥ໓ͼͳ͔ͬͨͷ͔ɻ
    • ౰࣌ͷඇ೉͕ؒҧͬͯͨ?
    • μϝͳ෦෼͕վળ͞Εͨ?

    View Slide

  9. ౰࣌ͷ੩తܕ෇͖ݴޠ

    View Slide

  10. ର৅ͱͳͬͨݴޠ
    • C++03: C++ 0x(΋͘͠͸11)͸·ͩϦϦʔε͞Εͯ
    ͍·ͤΜ
    • Java1.4: Java5͕ϦϦʔε͞ΕΔ௚લɺ΋͘͠͸Ϧ
    Ϧʔε௚ޙͰ͢

    View Slide

  11. ↓1िؒલͷ༑ਓͷπΠʔτ

    View Slide

  12. ඇ೉͞Εͨ఺
    1. ίϯύΠϧʹ͕͔͔࣌ؒΔ
    2. จ๏͕৑௕
    3. ܕ͕ځ۶
    4. ܕͷ͍ͤͰهड़ྔ͕૿͑Δ

    View Slide

  13. ίϯύΠϧʹ͕͔͔࣌ؒΔ
    • ίϯύΠϧܕݴޠ: ίϯύΠϧ͕ऴΘΔ·Ͱಈ࡞Λ
    ֬ೝͰ͖ͳ͍ɻ
    • ΠϯλϓϦλܕݴޠ: ͙͢ʹ࣮ߦͯ͠ಈ࡞Λ֬ೝͰ
    ͖Δɻ

    View Slide

  14. จ๏͕৑௕
    class Main {
    public static void main(String args[]) {
    System.out.println("Hello, world!!");
    }
    }
    puts “Hello, world!!”
    Java
    Ruby

    View Slide

  15. ܕ͕ځ۶
    (ͦͷ··Ͱ͸ॻ͚ͳ͍ɺ޻෉͕ඞཁ)
    x = [ 1, 2, “fizz”, [] ]
    ੩తܕ෇͖ݴޠ
    Ruby

    View Slide

  16. ܕͷ͍ͤͰهड़ྔ͕૿͑Δ
    ArrayList xs = new ArrayList();
    xs.add((Object)new Integer(1));
    xs.add((Object)new Integer(2));
    xs.add((Object)new Integer(3));
    [1, 2, 3]
    Java
    Ruby

    View Slide

  17. ͜͜·Ͱͷ·ͱΊ
    • ੩తܕ෇͖ݴޠ͸ॏްͰ͋Δ
    • هड़ྔ΋ଟ͍͠ɺಈ͔͢·Ͱͷ΋େม
    → ͍ܰݴޠ(Lightweight Language)ͷ΄͏͕ศར!!

    View Slide

  18. ࠷ۙͷ੩తܕ෇͖ݴޠ

    View Slide

  19. ࠷ۙొ৔ͨ͠੩తܕ෇͖ݴޠ
    • Scala: JVM্Ͱಈ࡞͢Δݴޠɻ better Javaͱͯ͠࢖ͬ
    ͍ͯΔͱ͜Ζ΋ଟ͍ɻ
    • F#: .NET্Ͱಈ࡞͢Δؔ਺ܕݴޠɻOCamlʹେ͖ͳӨ
    ڹΛड͚͍ͯΔɻ
    • OCaml/Haskell: ؔ਺ܕݴޠɻ࠷ۙɺొ৔ͨ͠Θ͚Ͱ͸
    ͳ͍͕ɺ࿩୊ʹͳΓ͕ͪɻ
    • ͦͷଞ: AltJSɺSwiftɺ….

    View Slide

  20. Ͳ͏มΘ͔ͬͨ
    1. ίϯύΠϧʹ͕͔͔࣌ؒΔ
    2. จ๏͕৑௕
    3. ܕ͕ځ۶
    4. ܕͷ͍ͤͰهड़ྔ͕૿͑Δ

    View Slide

  21. ίϯύΠϧʹ͕͔͔࣌ؒΔ
    • ʮίϯύΠϧ଎౓͕վળ͠·ͨ͠!!ʯͬͯݴ͓͏ͱ
    ͨ͠ΒɺScala͸ܹ஗ͩͬͨ…
    • ͨͿΜΈΜͳզຫͯ͠Δ

    View Slide

  22. http://tototoshi.hatenablog.com/entry/20130614/1371221918

    View Slide

  23. Q. Scala͸ͳͥ஗͍ͷ

    View Slide

  24. จ๏͕৑௕
    ϦονͳϦςϥϧ΍ܕਪ࿦͕ಋೖ͞Εɺ͍ͩͿ୹͘
    ͳͬͨ
    let () = print_endline "Hello, world!!"
    OCaml
    object Main extends App {
    println("Hello, world")
    }
    Scala

    View Slide

  25. ܕ͕ځ۶ɾܕͷ͍ͤͰهड़ྔ͕૿͑Δ
    • ౰࣌ͱࠓͰ͸ܕͷҐஔ෇͚͕ҟͳΔɻ
    • ౰࣌ͷܕ: ऑ͍ܕ෇͚ɻܕ҆શ͕อূ͞Εͳ͍ɻ
    • ࠓͷܕ: ڧ͍ܕ෇͚ɻܕ҆શ͕อূ͞ΕΔɻ
    • ܕ҆શ: ͜͜Ͱ͸ʮ࣮ߦ࣌ʹܕΤϥʔ͕ى͖ͳ͍ʯ
    ͘Β͍ͷҙຯɻ

    View Slide

  26. ऑ͍ܕ෇͚
    • ܕνΣοΫʹ௨ͬͯ΋ɺʮܕ҆શʯ͕อূ͞Εͳ͍
    • Java/C++ʹ͸Ωϟετ͕͋ΔͷͰɺίϯύΠϧʹ
    ੒ޭͯ͠΋ܕʹΑΔΤϥʔ͕ى͖Δ͔΋͠Εͳ͍
    Foo*p = (Foo*)0x42;
    p->f(); // ← ࢮ͵(ͨͿΜ)ɻ
    C++

    View Slide

  27. ڧ͍ܕ෇͚
    • ܕνΣοΫʹ௨Ε͹ɺʮܕ҆શʯ͕อূ͞ΕΔ
    • Ωϟετ౳ͷܕΛڧ੍తʹมߋ͢Δํ๏͸ͳ͍
    • ୯७ʹΩϟετΛͳ͚ͨͩͩ͘͠ͱɺ੍໿͕ݫ͘͠
    ͳΔ͚ͩͰخ͘͠ͳ͍
    • → ܕʹؔ͢Δڧྗͳػೳ͕༻ҙ͞ΕΔ͜ͱ͕ଟ
    ͍

    View Slide

  28. ࠷ۙͷܕγεςϜ

    View Slide

  29. ܕਪ࿦
    • ܕΛ(͋Δఔ౓)ॻ͔ͳͯ͘΋OK
    • Ͳ͜·Ͱਪ࿦ͯ͘͠ΕΔ͔͸ݴޠʹΑͬͯҟͳΔ
    // xsͷܕ͸string listͱਪ࿦͞ΕΔ
    let xs = ["foo"; "bar"; "baz"]
    OCaml

    View Slide

  30. Scalaͷܕਪ࿦
    • ϝιουͷҾ਺ɺฦΓ஋͸ਪ࿦͠ͳ͍
    • ม਺ఆٛͷܕ͸ਪ࿦͢Δ
    // ϝιουͷҾ਺ͱฦΓ஋ͷܕ͸ॻ͘(লུͰ͖ͳ͍)
    def f(x : Int, y : Int) : Int = {
    // ม਺ఆٛͷܕ͸লུͰ͖Δ
    val z = x + y
    z
    }
    Scala

    View Slide

  31. OCamlͷܕਪ࿦
    • ؔ਺ͷҾ਺ɺฦΓ஋΋ਪ࿦͢Δ
    (* ϝιουͷҾ਺ͱฦΓ஋ͷܕΛলུͰ͖Δ *)
    let f x y =
    (* ม਺ఆٛͷܕ΋লུͰ͖Δ *)
    let z = x + y in
    z
    OCaml

    View Slide

  32. ܕ͕͍ܰ
    • ܕΛ࡞Δํ๏͕ଟ͍
    • ϑΝΠϧΛ࡞ͬͯɺΫϥεΛఆٛͯ͠…ɺΈ͍ͨͳ
    ͜ͱΛ͠ͳͯ͘΋৽͍͠ܕΛ࡞ΕΔ
    • Ұ෦ͷਓ͸ʮܕ͕͍ܰʯͱදݱ͢Δ

    View Slide

  33. ௚ੵܕ
    • 2ͭҎ্ͷܕΛ૊ʹͨ͠ܕ
    def getPoint() : (Int, Int) = {
    (1, 2)
    }
    Scala
    def get_point
    [1, 2] # x࠲ඪͱy࠲ඪ
    end
    Ruby
    (Int, Int) Ͱɺ2ͭͷIntͷ஋ͷ
    ૊Λද͢ܕΛ࡞ΕΔ

    View Slide

  34. ௚࿨ܕ
    • ͓ޓ͍ʹ۠ผ͞ΕΔܕΛఆٛ͢Δ
    • C/Javaͷenumʹࣅ͍ͯΔ͕ύϥϝʔλΛ࣋ͯΔͷ
    ͰΑΓॊೈ
    (* τϥϯϓͷΧʔυΛఆٛ͢Δ *)
    type card = Number of int | J | Q | K
    OCaml

    View Slide

  35. ύλʔϯϚον
    • ௚࿨ܕʹରͯ͠ͷ෼ذ͸ɺઐ༻ͷߏจ͕͋Δ
    • ໢ཏ͍ͯ͠Δ͜ͱΛίϯύΠϥ͕อূ͢Δ
    (* Χʔυͷ਺஋Λऔಘ͢Δؔ਺ *)
    let get_number x =
    match x with
    | Numebr n -> n
    | J -> 11
    | Q -> 12
    | K -> 13

    View Slide

  36. ΋ͬͱ͍͢͝ܕ
    • Ϩίʔυܕ: ௚ੵܕͷ1छɻ0൪໨ɺ1൪໨ͱ͍͏஋
    ͷ͔ΘΓʹɺ໊લΛ༩͑ΕΔɻ
    • ߏ଄త෦෼ܕ: fͱ͍͏ϝιουͱgͱ͍͏ϝιου
    Λ͍࣋ͬͯΔܕɺͱ͍͏ͷ͕දݱͰ͖Δɻ(Ұ෦Ͱ
    ੩తduck typeͱݺ͹ΕΔ)
    • ܕ෇͖printf: printf "%s" ͸string͔͠ड͚ͱΒͳ
    ͍ɺͱ͍͏͜ͱ͕Ͱ͖Δ

    View Slide

  37. ܕͰՄೳʹͳΔ͜ͱ
    • ܕͷදݱྗ্͕͍ͬͯΔͷͰઃܭҙਤΛදݱͰ͖Δ
    • ίϯύΠϧ͕ҰछͷςετʹͳΔ
    • ྫ: ը໘ʹग़ྗ͢Δจࣈྻ͸ඞͣαχλΠζ͞Ε
    ͯͳ͚Ε͹ͳΒ͍(ϑΝϯτϜλΠϓ; ༓ྶܕ)
    • υΩϡϝϯτͷҰछʹͳΔ
    • ݕࡧ΋Ͱ͖Δ: Hoogle, OCamlScope

    View Slide

  38. Rubyͬͯܕ͸͔ͭͳ͍ͷ?
    • RubyʹܕΛ͚ͭΔ͜ͱΛ໨తͱͨ͠ϓϩδΣΫτ
    ͕͋Δ
    • ྫ: Diamondback Ruby http://www.cs.umd.edu/projects/PL/druby/
    class String
    ##% "+" : (String) -> String
    def +(p0); end
    ##% insert : (Fixnum, String) -> String
    def insert(p0, p1); end
    ...
    end

    View Slide

  39. ·ͱΊ: Ͳ͕͍͍ͬͪͷ?
    • έʔεɾόΠɾέʔε
    • ܕ͸੍໿: Ͱ͖Δ͜ͱ͕ಘΔ͕ɺޡΓ΋ݮΒ͢
    • ҆શੑΛॏࢹ͢ΔͳΒܕΛ࢖͏΂͖ͩ͠ɺߴ଎ʹ
    ࡞Γ͍ͨͳΒܕΛ࢖Θͳͯ͘΋͍͍
    • ܕγεςϜʹ΋͍Ζ͍Ζ͋ΔͷͰɺঢ়گʹซͤͯબ
    ୒͠·͠ΐ͏

    View Slide