Scalaで関数

 Scalaで関数

1a679952cdf455ecd6a15cbde7ae80d5?s=128

Tomohiko Himura

May 28, 2016
Tweet

Transcript

  1. ScalaͰؔ਺ 2016-05-28 Scala෱Ԭ2016

  2. ͻΉΒ ͱ΋ͻ͜ #͍͢͝޿ౡ Ͱָ͘͠ϓϩάϥϛϯάΛ΋͘΋ֶ͘΅͏ Scalaྺ 1೥͙Β͍(ॳ৺ऀ) ޷͖ͳϝιου ??? Twitter: eielh

    GitHub: eiel
  3. None
  4. ΍Δ΍Δ࠮ٗͳ͏

  5. 「せっかく広島から行くし LTを申し込もう」 5月某日 Scala福岡に申し込み

  6. ネタが浮かばず

  7. どんな内容でも 誤魔化せそうな タイトルをつけとこう

  8. ScalaͰؔ਺

  9. None
  10. Scalaのメソッドって 関数ではないらしい

  11. 関数型言語なのに! ! JavaScriptとか関数

  12. 2引数のメソッドで 遊んでみます

  13. repl> def add(x: Int, y: Int) = x + y

    repl> :type add <console>:13: error: missing argument list for method add Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`.
  14. repl> def add(x: Int, y: Int) = x + y

    repl> :type add <console>:13: error: missing argument list for method add Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`. ϝιου͸ؔ਺ʹม׵͠ͳ͍ͱ UZQF͸࢖͑ͳ͍Έ͍ͨ
  15. アンダースコアを後ろに つけると変換できるらしい

  16. repl> :type add _ (Int, Int) => Int

  17. repl> :type add _ (Int, Int) => Int repl> (add

    _)(1, 2) Int = 3
  18. (1, 2)とか変数に入れて 使えたら便利なのになぁ

  19. repl> val args = (1, 2)

  20. repl> val args = (1, 2) repl> (add _)(args) error:

    not enough arguments for method apply: (v1: Int, v2: Int)Int in trait Function2. Unspecified value parameter v2.
  21. repl> val args = (1, 2) repl> (add _)(args) error:

    not enough arguments for method apply: (v1: Int, v2: Int)Int in trait Function2. Unspecified value parameter v2. ̎ͭΊͷҾ਺͕ͳ͍ͬͯ͞
  22. タプル化したら
 使えるらしい

  23. repl> (add _).tupled(args) 3

  24. repl> (add _).tupled(args) 3 ࢖͑ͨخ͍͠

  25. 引数を一つづつ 適用させられたらいいな

  26. repl> (add _)(1)(2) error: not enough arguments for method apply:

    (v1: Int, v2: Int)Int in trait Function2. Unspecified value parameter v2.
  27. repl> (add _)(1)(2) error: not enough arguments for method apply:

    (v1: Int, v2: Int)Int in trait Function2. Unspecified value parameter v2. ΍ͬͺΓ࢖͑ͳ͍ʜ
  28. カリー化したら
 使えるらしい

  29. repl> (add _).curried(1)(2) 3

  30. repl> (add _).curried(1)(2) 3 repl> val add1 = (add _).curried(1)

    Int => Int repl> add1(2) 3
  31. repl> (add _).curried(1)(2) 3 ࢖͑ͨخ͍͠ repl> val add1 = (add

    _).curried(1) Int => Int repl> add1(2) 3
  32. repl> val basic = add _ repl> val tupled =

    basic.tupled repl> val curried = basic.curried repl> basic(1, 2) // 3 repl> basic((1, 2)) // compile error repl> tupled(1, 2) // 3 repl> tupled((1, 2)) // 3 real> tupled(1 -> 2) // 3 repl> curried(1)(2) // 3
  33. ܕ ͬ͘͟Γ ϕʔγοΫ *OU *OU *OU 'VODUJPO<*OU *OU *OU> ̎ͭͷҾ਺Λड͚औΓ


    Ұͭ஋Λฦؔ͢਺ λϓϧԽ *OU *OU *OU 'VODUJPO< *OU *OU *OU> ͭͷҾ਺ λϓϧ Λड͚औΓ ̍ͭ஋Λฦؔ͢਺ ΧϦʔԽ *OU *OU*OU ̍ͭͷҾ਺Λड͚औΓ
 ҰͭҾ਺Λड͚औΔؔ਺Λฦؔ͢਺
  34. UVQMFE CBTJD DVSSJFE BEEϝιου add _ def add(x: Int, y:

    Int): Int = basic(x, y) def add(x: Int, y: Int): Int = x + y BEE5VQMFEϝιου def addTupled(x: (Int, Int)): Int = x._1 + x._2 basic.tupled Function.untupled(tupled) Function.uncurried(curried) basic.curried (x: Int, y: Int) => x + y BEE$VSSZϝιου def addCurry(x: Int)(y: Int): Int = x + y ((x: (Int, Int)) => x._1 + x._1)((1 , 2)) (x: Int) => (y: Int) => x + y def addTupled(x: (Int, Int)):Int = tupled(x) addTupled _ def addCurry(x: Int)(y: Int) = curried(x)(y) addCurry _
  35. tupledの魅力

  36. val `@` = 5 tupled((`@`,`@`))

  37. tupled ((((((((`@`,`@`))))))))

  38. ところでHaskell

  39. UVQMFE DVSSJFE curried = curry tupled tupled = uncurry curried

    tupled :: (Int, Int) -> Int tupled (x, y) = x + y curried :: Int -> Int -> Int curried x y = x +y
  40. シンプル

  41. Scalaで関数型 難しいなぁ

  42. val ガクガクブルブル = tupled val ` ;゚Д゚` = (40, 2)

  43. ガクガクブルブル ((((((((((` ;゚Д゚`))))))))))

  44. 42

  45. Scalaで関数プログラミング
 するのはHaskellより難しいので Scalaチームにひとりぐらい Haskellの勉強してたりすると チームに多様性が生まれて 良いんじゃなかと思う という話

  46. よりScalaの関数について知りたいなら • Scala の関数
 http://tkawachi.github.io/blog/2014/11/26/1/