+
+\begin{code}
+collectSigTysFromPats :: [InPat name] -> [HsType name]
+collectSigTysFromPats pats = foldr collect_pat [] pats
+
+collectSigTysFromPat :: InPat name -> [HsType name]
+collectSigTysFromPat pat = collect_pat pat []
+
+collect_pat (SigPatIn pat ty) acc = collect_pat pat (ty:acc)
+collect_pat WildPatIn acc = acc
+collect_pat (VarPatIn var) acc = acc
+collect_pat (LitPatIn _) acc = acc
+collect_pat (LazyPatIn pat) acc = collect_pat pat acc
+collect_pat (AsPatIn a pat) acc = collect_pat pat acc
+collect_pat (NPatIn _) acc = acc
+collect_pat (NPlusKPatIn n _ _) acc = acc
+collect_pat (ConPatIn c pats) acc = foldr collect_pat acc pats
+collect_pat (ConOpPatIn p1 c f p2) acc = collect_pat p1 (collect_pat p2 acc)
+collect_pat (ParPatIn pat) acc = collect_pat pat acc
+collect_pat (ListPatIn pats) acc = foldr collect_pat acc pats
+collect_pat (PArrPatIn pats) acc = foldr collect_pat acc pats
+collect_pat (TuplePatIn pats _) acc = foldr collect_pat acc pats
+collect_pat (RecPatIn c fields) acc = foldr (\ (f,pat,_) acc -> collect_pat pat acc) acc fields
+-- Generics
+collect_pat (TypePatIn ty) acc = ty:acc
+\end{code}
+