|
| 1 | +import scala.language.higherKinds |
| 2 | + |
| 3 | +trait Base { |
| 4 | + type Rep[T] |
| 5 | +} |
| 6 | + |
| 7 | +trait BaseExp extends Base { |
| 8 | + type Rep[T] = Exp[T] |
| 9 | + case class Exp[T](v: T) |
| 10 | +} |
| 11 | + |
| 12 | +trait BaseStr extends Base { |
| 13 | + type Rep[T] = String |
| 14 | +} |
| 15 | + |
| 16 | +trait BaseDirect extends Base { |
| 17 | + type Rep[T] = T |
| 18 | +} |
| 19 | + |
| 20 | +trait Test1 { |
| 21 | + trait Monad[X] { |
| 22 | + def x: X |
| 23 | + } |
| 24 | + sealed abstract class Either[A,B] |
| 25 | + case class Left[A,B](x: A) extends Either[A,B] with Monad[A] |
| 26 | + case class Right[A,B](x: B) extends Either[A,B] with Monad[B] |
| 27 | + def flatMap[X,Y,M[X]<:Monad[X]](m: M[X], f: X => M[Y]): M[Y] = f(m.x) |
| 28 | + println(flatMap(Left(1), {x: Int => Left(x)})) |
| 29 | +} |
| 30 | +trait Test2 { |
| 31 | + trait Monad[X] { |
| 32 | + def x: X |
| 33 | + } |
| 34 | + sealed abstract class Either[A,B] |
| 35 | + case class Left[A,B](x: A) extends Either[A,B] with Monad[A] |
| 36 | + case class Right[A,B](x: B) extends Either[A,B] with Monad[B] |
| 37 | + def flatMap[X,Y,M[X]](m: M[X], f: X => M[Y]): M[Y] |
| 38 | + println(flatMap(Left(1), {x: Int => Left(x)})) |
| 39 | +} |
| 40 | +trait Test3 { |
| 41 | + def flatMap[X,Y,M[X]](m: M[X], f: X => M[Y]): M[Y] |
| 42 | + println(flatMap(Some(1), {x: Int => Some(x)})) |
| 43 | +} |
0 commit comments