+Structure Global Γ :=
+{ glob_wv : WeakExprVar
+; glob_kinds : list Kind
+; glob_tf : IList _ (fun κ => HaskType Γ κ) glob_kinds -> HaskType Γ ★
+}.
+Coercion glob_tf : Global >-> Funclass.
+Coercion glob_wv : Global >-> WeakExprVar.
+
+(* From (t1->(t2->(t3-> ... t))), return t1::t2::t3::...nil *)
+(* this is a billion times uglier than it needs to be as a result of how primitive Coq's termiation checker is *)
+Definition take_arg_types : forall {TV}{κ}(exp: RawHaskType TV κ), list (RawHaskType TV κ).
+refine (fix take_arg_types {TV}{κ}(exp: RawHaskType TV κ) {struct exp} : list (RawHaskType TV κ) :=
+ match exp as E in RawHaskType _ K return κ=K -> list (RawHaskType _ K) with
+ | TApp κ₁ κ₂ x y =>
+ fun eqpf =>
+ ((fun q:list (RawHaskType TV κ₂) =>
+ match x as X in RawHaskType _ KX return κ₂ ⇛ κ₁ = KX -> list (RawHaskType _ _) with
+ | TApp κ₁' κ₂' x' y' =>
+ fun eqpf' => match x' in RawHaskType _ KX' return (κ₂' ⇛ κ₁') = KX' -> _ with
+ | TArrow => fun eqpf'' => _
+ | _ => fun _ => nil
+ end (refl_equal _)
+ | _ => fun _ => nil
+ end (refl_equal _))
+ (take_arg_types TV _ y))
+ | _ => fun _ => nil
+ end (refl_equal _)).
+ subst; inversion eqpf''; subst.
+ apply (y'::q).
+ Defined.