Rubyistのための型入門

501e65e32870561d73b1158370766664?s=47 mzp
March 28, 2015

 Rubyistのための型入門

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

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

501e65e32870561d73b1158370766664?s=128

mzp

March 28, 2015
Tweet

Transcript

  1. mzp RubyistͷͨΊͷ ܕೖ໳

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

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

  4. ໊ݹ԰Rubyձٞ02

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

  6. LLશ੝ظ • ౰࣌͸LL(Lightweight Language)ͱͯ͠ɺ·ͱΊͯޠ ΒΕ͍ͯͨɻ • Pݴޠ(Perl, Python, PHP, Ruby)Έ͍ͨͳݴ༿΋͋ͬͨ

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

  8. ͦΕ͔Β10೥… • LLͰ࢓ࣄ͢Δͷ͸௝͍͠࿩Ͱ͸ͳ͘ͳͬͨ • Scala, Swift, F#, Go, TypeScript ͳͲ৽͍͠੩తܕ෇

    ͖ݴޠ΋ొ৔͍ͯ͠Δ • ੩తܕ෇͖ݴޠ͕ͳͥ໓ͼͳ͔ͬͨͷ͔ɻ • ౰࣌ͷඇ೉͕ؒҧͬͯͨ? • μϝͳ෦෼͕վળ͞Εͨ?
  9. ౰࣌ͷ੩తܕ෇͖ݴޠ

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

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

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

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

  14. จ๏͕৑௕ class Main { public static void main(String args[]) {

    System.out.println("Hello, world!!"); } } puts “Hello, world!!” Java Ruby
  15. ܕ͕ځ۶ (ͦͷ··Ͱ͸ॻ͚ͳ͍ɺ޻෉͕ඞཁ) x = [ 1, 2, “fizz”, [] ]

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

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

  19. ࠷ۙొ৔ͨ͠੩తܕ෇͖ݴޠ • Scala: JVM্Ͱಈ࡞͢Δݴޠɻ better Javaͱͯ͠࢖ͬ ͍ͯΔͱ͜Ζ΋ଟ͍ɻ • F#: .NET্Ͱಈ࡞͢Δؔ਺ܕݴޠɻOCamlʹେ͖ͳӨ

    ڹΛड͚͍ͯΔɻ • OCaml/Haskell: ؔ਺ܕݴޠɻ࠷ۙɺొ৔ͨ͠Θ͚Ͱ͸ ͳ͍͕ɺ࿩୊ʹͳΓ͕ͪɻ • ͦͷଞ: AltJSɺSwiftɺ….
  20. Ͳ͏มΘ͔ͬͨ 1. ίϯύΠϧʹ͕͔͔࣌ؒΔ 2. จ๏͕৑௕ 3. ܕ͕ځ۶ 4. ܕͷ͍ͤͰهड़ྔ͕૿͑Δ

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

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

  23. Q. Scala͸ͳͥ஗͍ͷ

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

    object Main extends App { println("Hello, world") } Scala
  25. ܕ͕ځ۶ɾܕͷ͍ͤͰهड़ྔ͕૿͑Δ • ౰࣌ͱࠓͰ͸ܕͷҐஔ෇͚͕ҟͳΔɻ • ౰࣌ͷܕ: ऑ͍ܕ෇͚ɻܕ҆શ͕อূ͞Εͳ͍ɻ • ࠓͷܕ: ڧ͍ܕ෇͚ɻܕ҆શ͕อূ͞ΕΔɻ •

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

    // ← ࢮ͵(ͨͿΜ)ɻ C++
  27. ڧ͍ܕ෇͚ • ܕνΣοΫʹ௨Ε͹ɺʮܕ҆શʯ͕อূ͞ΕΔ • Ωϟετ౳ͷܕΛڧ੍తʹมߋ͢Δํ๏͸ͳ͍ • ୯७ʹΩϟετΛͳ͚ͨͩͩ͘͠ͱɺ੍໿͕ݫ͘͠ ͳΔ͚ͩͰخ͘͠ͳ͍ • →

    ܕʹؔ͢Δڧྗͳػೳ͕༻ҙ͞ΕΔ͜ͱ͕ଟ ͍
  28. ࠷ۙͷܕγεςϜ

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

    = ["foo"; "bar"; "baz"] OCaml
  30. Scalaͷܕਪ࿦ • ϝιουͷҾ਺ɺฦΓ஋͸ਪ࿦͠ͳ͍ • ม਺ఆٛͷܕ͸ਪ࿦͢Δ // ϝιουͷҾ਺ͱฦΓ஋ͷܕ͸ॻ͘(লུͰ͖ͳ͍) def f(x :

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

    = (* ม਺ఆٛͷܕ΋লུͰ͖Δ *) let z = x + y in z OCaml
  32. ܕ͕͍ܰ • ܕΛ࡞Δํ๏͕ଟ͍ • ϑΝΠϧΛ࡞ͬͯɺΫϥεΛఆٛͯ͠…ɺΈ͍ͨͳ ͜ͱΛ͠ͳͯ͘΋৽͍͠ܕΛ࡞ΕΔ • Ұ෦ͷਓ͸ʮܕ͕͍ܰʯͱදݱ͢Δ

  33. ௚ੵܕ • 2ͭҎ্ͷܕΛ૊ʹͨ͠ܕ def getPoint() : (Int, Int) = {

    (1, 2) } Scala def get_point [1, 2] # x࠲ඪͱy࠲ඪ end Ruby (Int, Int) Ͱɺ2ͭͷIntͷ஋ͷ ૊Λද͢ܕΛ࡞ΕΔ
  34. ௚࿨ܕ • ͓ޓ͍ʹ۠ผ͞ΕΔܕΛఆٛ͢Δ • C/Javaͷenumʹࣅ͍ͯΔ͕ύϥϝʔλΛ࣋ͯΔͷ ͰΑΓॊೈ (* τϥϯϓͷΧʔυΛఆٛ͢Δ *) type

    card = Number of int | J | Q | K OCaml
  35. ύλʔϯϚον • ௚࿨ܕʹରͯ͠ͷ෼ذ͸ɺઐ༻ͷߏจ͕͋Δ • ໢ཏ͍ͯ͠Δ͜ͱΛίϯύΠϥ͕อূ͢Δ (* Χʔυͷ਺஋Λऔಘ͢Δؔ਺ *) let get_number

    x = match x with | Numebr n -> n | J -> 11 | Q -> 12 | K -> 13
  36. ΋ͬͱ͍͢͝ܕ • Ϩίʔυܕ: ௚ੵܕͷ1छɻ0൪໨ɺ1൪໨ͱ͍͏஋ ͷ͔ΘΓʹɺ໊લΛ༩͑ΕΔɻ • ߏ଄త෦෼ܕ: fͱ͍͏ϝιουͱgͱ͍͏ϝιου Λ͍࣋ͬͯΔܕɺͱ͍͏ͷ͕දݱͰ͖Δɻ(Ұ෦Ͱ ੩తduck

    typeͱݺ͹ΕΔ) • ܕ෇͖printf: printf "%s" ͸string͔͠ड͚ͱΒͳ ͍ɺͱ͍͏͜ͱ͕Ͱ͖Δ
  37. ܕͰՄೳʹͳΔ͜ͱ • ܕͷදݱྗ্͕͍ͬͯΔͷͰઃܭҙਤΛදݱͰ͖Δ • ίϯύΠϧ͕ҰछͷςετʹͳΔ • ྫ: ը໘ʹग़ྗ͢Δจࣈྻ͸ඞͣαχλΠζ͞Ε ͯͳ͚Ε͹ͳΒ͍(ϑΝϯτϜλΠϓ; ༓ྶܕ)

    • υΩϡϝϯτͷҰछʹͳΔ • ݕࡧ΋Ͱ͖Δ: Hoogle, OCamlScope
  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
  39. ·ͱΊ: Ͳ͕͍͍ͬͪͷ? • έʔεɾόΠɾέʔε • ܕ͸੍໿: Ͱ͖Δ͜ͱ͕ಘΔ͕ɺޡΓ΋ݮΒ͢ • ҆શੑΛॏࢹ͢ΔͳΒܕΛ࢖͏΂͖ͩ͠ɺߴ଎ʹ ࡞Γ͍ͨͳΒܕΛ࢖Θͳͯ͘΋͍͍

    • ܕγεςϜʹ΋͍Ζ͍Ζ͋ΔͷͰɺঢ়گʹซͤͯબ ୒͠·͠ΐ͏