+Note [Higher rank methods]
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+Higher-rank method types don't work, because we'd generate a bimap that
+needs impredicative polymorphism. In principle that should be possible
+(with boxy types and all) but it would take a bit of working out. Here's
+an example:
+ class ChurchEncode k where
+ match :: k -> z
+ -> (forall a b z. a -> b -> z) {- product -}
+ -> (forall a z. a -> z) {- left -}
+ -> (forall a z. a -> z) {- right -}
+ -> z
+
+ match {| Unit |} Unit unit prod left right = unit
+ match {| a :*: b |} (x :*: y) unit prod left right = prod x y
+ match {| a :+: b |} (Inl l) unit prod left right = left l
+ match {| a :+: b |} (Inr r) unit prod left right = right r
+