a
Size: a a a
IO
SingAll,type family Sing :: k -> Type
class SingI t where
sing :: Sing t
class SingAll k c where
singAll :: Sing (t :: k) -> (c t => r) -> r
data Tag = Tag1 | Tag2
data STag t where
STag1 :: STag 'Tag1
STag2 :: STag 'Tag2
type instance Sing = STag
instance SingI 'Tag1 where
sing = STag1
instance SingI 'Tag2 where
sing = STag2
instance (c 'Tag1, c 'Tag2) => SingAll Tag c where
singAll STag1 f = f
singAll STag2 f = f
deriveAlpha :: forall t r . SingI t => (Alpha t => r) -> r
deriveAlpha f = singAll @_ @Alpha (sing @t) f
STag, SingAll, дать инстанс SingI, зато сами derive функции можно не трогать[
JS
[
JS
[
[
[
[