1 def enterInt(k: Int): KeyLog[Int] = KeyIn(k, "Number:"+k.toString) 2 //> enterInt: (k: Int)Exercises.keylog.KeyLog[Int]
3 def enterStr(k: String): KeyLog[String] = KeyIn(k,"String:"+k) 4 //> enterStr: (k: String)Exercises.keylog.KeyLog[String]
5 enterInt(3) >>= {a => enterInt(4) >>= {b => enterStr("Result:") map {c => c + (a * b).toString} }} 6 //> res0: Exercises.keylog.KeyLog[String] = [Result:12,Number:3;Number:4;String 7 //| :Result:;]
8 for { 9 a <- enterInt(3) 10 b <- enterInt(4) 11 c <- enterStr("Result:") 12 } yield c + (a * b).toString //> res1: Exercises.keylog.KeyLog[String] = [Result:12,Number:3;Number:4;String 13 //| :Result:;]
1 enterInt(3) >>= {a => (KeyLock: KeyLog[Int]) >>= {b => enterStr("Result:") map {c => c + (a * b).toString} }}
2 //> res2: Exercises.keylog.KeyLog[String] = [Keypad Locked]
3 for {
4 a <- enterInt(3)
5 b <- enterInt(4)
6 x <- (KeyLock: KeyLog[String])
7 c <- enterStr("Result:")
8 } yield c + (a * b).toString //> res3: Exercises.keylog.KeyLog[String] = [Keypad Locked]
1 implicit object keylogMonad extends Monad[KeyLog] with MonadPlus[KeyLog] { 2 def point[K](k: => K): KeyLog[K] = KeyIn(k,"") 3 def bind[K,I](kk: KeyLog[K])(f: K => KeyLog[I]): KeyLog[I] = kk flatMap f 4
5 def empty[K]: KeyLog[K] = KeyLock 6 def plus[K](a: KeyLog[K], b: => KeyLog[K]): KeyLog[K] = a match { 7 case KeyIn(value,log) => KeyIn(value,log) 8 case KeyLock => b 9 } 10 }
1 for { 2 a <- enterInt(3) 3 b <- enterInt(4) 4 c <- enterStr("Result:") 5 } yield c + (a * b).toString //> res3: Exercises.keylog.KeyLog[String] = [Result:12,Number:3;Number:4;String 6 //| :Result:;]
7 for { 8 a <- enterInt(3) 9 b <- enterInt(4) if b > 0
10 c <- enterStr("Result:") 11 } yield c + (a * b).toString //> res4: Exercises.keylog.KeyLog[String] = [Result:12,Number:3;Number:4;;Strin 12 //| g:Result:;]
13 for { 14 a <- enterInt(3) 15 b <- enterInt(4) if b > 5
16 c <- enterStr("Result:") 17 } yield c + (a * b).toString //> res5: Exercises.keylog.KeyLog[String] = [Keypad Locked]