Typowe wątki heterogeniczne listy i domyślne (?) Z rodzinami typów?
Pracuję nad biblioteką, w której chcę zdefiniować klasę rekurencyjną, którą tutaj uprościłem:
{-# 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
To pozwala mi np.
*Main Data.Label> let f = runStack $ Snoc (Snoc Top fst) head :: [(a,x)] -> a
*Main Data.Label> f [('a',undefined)]
'a'
Ale wydaje się, że wymaga to ostrożnego używania adnotacji typu, w przeciwnym razie ...
*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
Myślę, że są to te same kwestie, które zostały poruszone wto pytanie, ale mam problem z dostosowaniem tego rozwiązania tutaj. Czy mogę użyć rodzin typów lub innej metody, aby uzyskać bardziej przyjazne dla użytkownika rozwiązanie dla mojego rekurencyjnego stosu kontynuacji?