1 Barbell(0,0).loadLeft(1).loadRight(2).loadRight(100).loadLeft(2).loadRight(-99) 2 //> res11: Exercises.monad.Barbell = Barbell(3,3)
1 type Discs = Int //杠铃片数量
2 case class Barbell(left: Discs, right: Discs) { 3 def loadLeft(n: Discs): Option[Barbell] = copy(left = left + n) match { 4 case Barbell(left,right) => if ( (left+right <= 20) && math.abs(left-right) <=3 ) Some(Barbell(left,right)) else None 5 case _ => None 6 } 7 def loadRight(n: Discs): Option[Barbell] = copy(right = right + n) match { 8 case Barbell(left,right) => if ( (left+right <= 20) && math.abs(left-right) <=3 ) Some(Barbell(left,right)) else None 9 case _ => None 10 } 11 } 12 Barbell(0,0).loadLeft(1) //> res8: Option[Exercises.monad.Barbell] = Some(Barbell(1,0))
13 Barbell(1,0).loadRight(1) //> res9: Option[Exercises.monad.Barbell] = Some(Barbell(1,1))
14 Barbell(2,1).loadLeft(-1) //> res10: Option[Exercises.monad.Barbell] = Some(Barbell(1,1))
15 Barbell(0,0).loadLeft(4) //> res11: Option[Exercises.monad.Barbell] = None
16 Barbell(15,1).loadRight(15) //> res12: Option[Exercises.monad.Barbell] = None
1 Barbell(0,0).loadLeft(3) >>= {_.loadRight(3)} //> res13: Option[Exercises.monad.Barbell] = Some(Barbell(3,3))
2 Barbell(0,0).loadLeft(3) >>= {_.loadRight(3) >>= {_.loadRight(1)}} 3 //> res14: Option[Exercises.monad.Barbell] = Some(Barbell(3,4))
4 Barbell(0,0).loadLeft(3) >>= {_.loadRight(3) >>= {_.loadRight(1) >>= {_.loadLeft(4)}}} 5 //> res15: Option[Exercises.monad.Barbell] = Some(Barbell(7,4))
6 Barbell(0,0).loadLeft(1) >>= {_.loadRight(5) >>= {_.loadLeft(2)}} 7 //> res16: Option[Exercises.monad.Barbell] = None
8 Monad[Option].point(Barbell(0,0)) >>= {_.loadLeft(3) >>= {_.loadRight(6)}} 9 //> res17: Option[Exercises.monad.Barbell] = Some(Barbell(3,6))
1 def addWeight: Option[Barbell] = for { 2 b0 <- Monad[Option].point(Barbell(0,0)) 3 b1 <- b0.loadLeft(3) 4 b2 <- b1.loadRight(3) 5 } yield b2 //> addWeight: => Option[Exercises.monad.Barbell]
6 addWeight //> res18: Option[Exercises.monad.Barbell] = Some(Barbell(3,3))
7
8 def addWeight1: Option[Barbell] = for { 9 b0 <- Monad[Option].point(Barbell(0,0)) 10 b1 <- b0.loadLeft(4) 11 b2 <- b1.loadRight(3) 12 } yield b2 //> addWeight1: => Option[Exercises.monad.Barbell]
13 addWeight1 //> res19: Option[Exercises.monad.Barbell] = None