Field names need not indicate types, a good IDE makes that information available. Replace singleTree_ in SkewBLayer with the simpler el. SkewBinomialLayer decomposes:
data Layer f d where
Layer0 :: Layer 0
Layer :: KnownNat d => f (Layer f d) -> Layer f (d + 1)
data SkewBinomial a l where
SkewA= ::SkewA { left_ :: Tree a l, right_ :: Tree a l } -> SkewBinomial a l
SkewB| ::SkewB { single_ :: a, linked_ :: Tree a l, lower_ :: l } -> SkewBinomial a l
Binomial| ::Binomial { linked_ :: Tree a l, lower_ :: l } -> SkewBinomial a l
data Tree a l = Tree a l deriving Functor
instance Ord a => Ord (Tree a l) where compare = comparing skewData
type SkewBinomialLayer a = Layer (SkewBinomial a)
combineTree t1 t2 el = min (Tree el $ Layer $ SkewA t2 t1)
$
let [small, big] = sort [t1, t2] in fmap (Layer . SkewB el big) small
combineTree' t1 t2 =
let [small, big] = sort [t1, t2] in fmap (Layer . Binomial big) small
Consider lens.