aboutsummaryrefslogtreecommitdiff
path: root/tests/pos/hk.scala
blob: a8f2aa5971cc7d756b27c25924c2c10e753b24e7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import language.higherKinds

object hk0 {

  abstract class Base {
    type Rep[T]
    val strRep: Rep[String]
  }

  class Sub extends Base {
    type Rep[T] = T
    val strRep = "abc"
    val sr: Rep[String] = ""
  }

  abstract class Functor[F[_]] {
    def map[A, B](f: A => B): F[A] => F[B]
  }
  val ml: Functor[List] = ???
  val mx = ml
  val mm: (Int => Boolean) => List[Int] => List[Boolean] = mx.map
}

object higherKinded {

  type Untyped = Null

  class Tree[-T >: Untyped] {
    type ThisType[-U >: Untyped] <: Tree[U]
    def withString(s: String): ThisType[String] = withString(s)
  }

  class Ident[-T >: Untyped] extends Tree[T] {
    type ThisType[-U >: Untyped] = Ident[U]
  }

  val id = new Ident[Integer]

  val y = id.withString("abc")

  val z: Ident[String] = y

  val zz: tpd.Tree = y

  abstract class Instance[T >: Untyped] {
    type Tree = higherKinded.Tree[T]
  }

  object tpd extends Instance[String]

  def transform(tree: Tree[String]) = {
    val tree1 = tree.withString("")
    tree1: Tree[String]
  }

}