Typ-Threaded heterogene Listen und Defaulting (?) Mit Typfamilien?

Ich arbeite an einer Bibliothek, in der ich eine rekursive Klasse definieren möchte, die ich hier vereinfacht habe:

{-# 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

So kann ich z.

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

Dies scheint jedoch einen sorgfältigen Umgang mit Typanmerkungen zu erfordern, ansonsten ...

*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

Ich denke, das sind die gleichen Themen, die in behandelt werdendiese Frage, aber ich habe Probleme, diese Lösung hier anzupassen. Kann ich mit Schriftfamilien oder einer anderen Methode eine benutzerfreundlichere Lösung für meinen rekursiven Fortsetzungsstapel finden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage