Listas heterogêneas de tipo segmentado e padronizado (?) Com famílias de tipos?

Eu estou trabalhando em uma biblioteca onde eu quero definir uma classe recursiva que eu simplifiquei aqui para:

{-# LANGUAGE MultiParamTypeClasses 
           , FlexibleInstances #-}

data Snoc st b c = Snoc (st b) (c -> b) 
data Top a = Top

class StackTo a st c  where
     runStack :: st c -> (c -> a)
instance StackTo a Top a where
     runStack _ = id
instance (StackTo a st b) => StackTo a (Snoc st b) c where
     runStack (Snoc st' cb) = runStack st' . cb

Isso me permite fazer, por exemplo

*Main Data.Label> let f = runStack $ Snoc (Snoc Top fst) head :: [(a,x)] -> a
*Main Data.Label> f [('a',undefined)] 
'a'

Mas isso parece exigir o uso cuidadoso de anotações de tipo, caso contrário ...

*Main Data.Label> let f = runStack $ Snoc (Snoc Top fst) head

<interactive>:1:1:
    No instance for (StackTo a0 Top b0)
      arising from a use of `runStack'
    Possible fix: add an instance declaration for (StackTo a0 Top b0)
    In the expression: runStack
    In the expression: runStack $ Snoc (Snoc Top fst) head
    In an equation for `it': it = runStack $ Snoc (Snoc Top fst) head

Eu acho que essas são as mesmas questões abordadasessa questão, mas estou tendo problemas para adaptar essa solução aqui. Posso usar famílias de tipos ou algum outro método para criar uma solução mais amigável para minha pilha de continuação recursiva?

questionAnswers(2)

yourAnswerToTheQuestion