trait HK {
  type Rep[X]

  // okay
  def unzip2[A, B](ps: Rep[List[(A, B)]]): Unit
  unzip2(null.asInstanceOf[Rep[List[(Int, String)]]])

  // okay
  def unzipHK[A, B, C[_]](ps: Rep[C[(A, B)]]): Unit
  unzipHK(null.asInstanceOf[Rep[List[(Int, String)]]])

  def unzipHKRet0[A, C[_]](ps: C[A]): C[Int]
  def ls: List[String]
  unzipHKRet0(ls)

  // fail
  def unzipHKRet[A, C[_]](ps: Rep[C[A]]): Rep[C[Int]]
  def rls: Rep[List[String]]
  unzipHKRet(rls)
}

trait HK1 {
  type Rep[A]
  def unzip1[A, B, C[_]](ps: Rep[C[(A, B)]]): (Rep[C[A]], Rep[C[B]])
  def doUnzip1[A, B](ps: Rep[List[(A, B)]]) = unzip1(ps)
}
