fork download
  1. import scala.language.higherKinds
  2. import scala.util.Random
  3.  
  4. object Main {
  5. case class MyType[A](value: List[A])
  6.  
  7. trait Functor[F[_]] {
  8. def map[A, B](fa: F[A])(f: A => B): F[B]
  9. }
  10.  
  11. val myFunctor: Functor[MyType] = new Functor[MyType] {
  12. val random = new Random()
  13.  
  14. override def map[A, B](fa: MyType[A])(f: A => B): MyType[B] =
  15. MyType(fa.value.flatMap(a =>
  16. List.fill(choose)(refine(f(a)).asInstanceOf[B])))
  17.  
  18. private def choose = random.nextInt(5)
  19.  
  20. private def refine(x: Any): Any = x match {
  21. case 5 => 8
  22. case _ => x
  23. }
  24. }
  25.  
  26. def main(args: Array[String]) {
  27. val m = myFunctor
  28.  
  29. val fa = MyType(List(1, 2, 3))
  30. println(m.map(fa)(i => i + 2))
  31. println(m.map(fa)(i => i + 2))
  32. println(m.map(fa)(i => i + 2))
  33. println(m.map(fa)(i => i + 2))
  34. println(m.map(fa)(i => i + 2))
  35. println(m.map(fa)(i => i + 2))
  36. }
  37. }
  38.  
Success #stdin #stdout 0.37s 322240KB
stdin
Standard input is empty
stdout
MyType(List(3, 3, 3, 8))
MyType(List(3, 3, 4, 4, 4, 8))
MyType(List(3, 3, 3, 3, 4, 8, 8, 8, 8))
MyType(List(3, 3, 4, 8, 8, 8))
MyType(List(3, 3, 3, 3, 4, 8, 8, 8, 8))
MyType(List(3, 8, 8, 8, 8))