Типовые многопоточные гетерогенные списки и дефолты (?) С семействами типов?

Я работаю над библиотекой, в которой я хочу определить рекурсивный класс, который я упростил здесь:

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

Это позволяет мне сделать, например,

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

Но это, кажется, требует осторожного использования аннотаций типов, в противном случае ...

*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

Я думаю, что это те же вопросы, которые рассматриваются вэтот вопрос, но у меня возникли проблемы с адаптацией этого решения здесь. Могу ли я использовать семейства типов или какой-либо другой метод, чтобы найти более удобное для пользователя решение для моего рекурсивного стека продолжения?

Ответы на вопрос(2)

Ваш ответ на вопрос