Successfully reported this slideshow.

Maverick sponsor LT

2

Share

Upcoming SlideShare
Gdc09 Minipong
Gdc09 Minipong
Loading in …3
×
1 of 22
1 of 22

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Maverick sponsor LT

  1. 1. Lightning Talk by presented by Naoki Aoyama (@aoiroaoino) in ScalaMatsuri 2016
  2. 2. > whoami • Naoki Aoyama • Twitter: @AoiroAoino • GitHub: @aoiroaoino • Scala Exp: about 4 years • committer
  3. 3. Product: 広告主 Audience It'swe! DSP SSP Media 広 告 出 稿 広 告 閲 覧 1. 広告リクエスト 2. bid request 3. 入札判断 4. bid response 5. 落札通知 6. 広告配信 afewsecs 100 ms or die! ※画像は http://jp.yamaha.com/products/network/downloads/tools/ より
  4. 4. Product: FSS Web管理画面から 紙広告を配信!
  5. 5. try { Tour of Lens
 in 3 minutes
  6. 6. Simple data structure case class Player(name: String, age: Int) val player = Player("aoino", 25) scala> player.name res0: String = aoino scala> player.copy(age = 26) res1: Player = Player(aoino,26)
  7. 7. Nested data structure case class Game(stageId: Int, player: Player) val game = Game(999, player) // get scala> game.player.name res6: String = aoino // set scala> game.copy( | player = game.player.copy( | name = "Aoyama" | ) | ) res7: Game = Game(999,Player(Aoyama,25))
  8. 8. Copy method hell ... aaa.copy ( bbb = aaa.bbb.copy ( ccc = aaa.bbb.ccc.copy ( ddd = aaa.bbb.ccc.ddd.copy ( eee = aaa.bbb.ccc.ddd.eee.copy ( fff = aaa.bbb.ccc.ddd.eee.fff.copy ( ggg = ) ) ) ) ) )
  9. 9. Motivation • We need the simple syntax like updating mutable objects
 -> want to avoid the copy method hell • We always want a "composability" and "reusability"
 -> compose of a getter/settter defined in
 the class is difficult
  10. 10. _人人人人_ > Lens <  ̄Y^Y^Y ̄
  11. 11. What s the Lens? • something like a getter/setter such as Java • functional reference
  12. 12. What s the Lens? getter: S => A e.g. player.name // => "aoino" setter: A => S => S e.g. player.copy(age = 26) // => Player("aoino",26)
  13. 13. What s the Lens? case class Lens[S, A](get: S => A, set: A => S => S)
  14. 14. Let s define some Lenses case class Lens[S, A](get: S => A, set: A => S => S) case class Player(name: String, age: Int) val _name: Lens[Player, String] = Lens( _.name, str => player => player.copy(name = str) ) val _age: Lens[Player, Int] = Lens( _.age, num => player => player.copy(age = num) )
  15. 15. Give it a try scala> _name.get(player) res2: String = aoino scala> _name.set("Aoyama")(player) res3: Player = Player(Aoyama,25) scala> _age.get(player) res4: Int = 25 scala> _age.set(26)(player) res5: Player = Player(aoino,26)
  16. 16. We need `composability` // in Function f: A => B g: B => C g compose f : A => C // in Lens sa: Lens[S, A] ab: Lens[A, B] sa compose ab : Lens[S, B] Note: Typically, Lenses `compose` is reverse compared to function.
  17. 17. Let s define `compose` method case class Lens[S, A](get: S => A, set: A => S => S){ def compose[B](other: Lens[A, B]): Lens[S, B] = Lens( s => other.get(this.get(s)), b => s => this.set( other.set(b)(this.get(s)) )(s) ) }
  18. 18. Give it a try val _player: Lens[Game, Player] = ... scala> (_player compose _name).get(game) res8: String = aoino scala> (_player compose _name).set("Aoyama")(game) res9: Game = Game(999,Player(Aoyama,25))
  19. 19. (_bbb compose _ccc compose _ddd compose _eee compose _fff compose _ggg).set( )(aaa) Lens for the win!!
  20. 20. Example in Maverick • We use Monocle in test codes.
  21. 21. } finally { –Naoki Aoyama Lens is Awesome! }

×