Consider leveraging simulacrum. It would make the api much less awkward.
Compare
AndXorK2[List, Int, String].transformP(new (List ~> Option) { def apply[A](l: List[A]) = l.headOption })((List(1), List("a")))
to
(List(1), List("a")).transform(new (List ~> Option) { def apply[A](l: List[A]) = l.headOption })
Consider leveraging simulacrum. It would make the api much less awkward.
Compare
to