[
Size: a a a
[
SG
SG
[

[
[
SG
SG
SG
SG
И
DM
data A = B | C | D
deriving stock (Eq, Show)
data S (a :: A) where
Sb :: S 'B
Sc :: S 'C
Sd :: S 'D
data SomeS where
SomeS :: S a -> SomeS
mbB :: a -> Maybe (S 'B)
mbB _ = Just Sb
mbC :: a -> Maybe (S 'C)
mbC _ = Just Sc
xs :: [Maybe SomeS]
xs = [SomeS <$> mbC 1, SomeS <$> mbB 1]
ys :: [A]
ys = catMaybes $ xs <&> \case
Just (SomeS x) -> case x of
Sb -> Just B
Sc -> Just C
Sd -> Just D
Nothing -> Nothing
DM
DM
DM
S - синглтон для AmbA и mbB — функции, возвращающие меткиSb и Sc в один список сложить не получится, ибо они имеют разные типы (S ‘B и S ‘C)SomeS "раскрываем" его и кладем в список соотв.значение меткиSG
SG
DM
[