можно сделать что-то вроде
f :: [Dynamic] -> [String]
f = catMaybe \x ->
case fromDynamic x of
Just (x :: Int) -> Just (show x)
Nothing -> case fromDynamic x of
Just (x :: String) -> Just x
_ -> Nothing
-- или
f :: [Dynamic] -> [String]
f = catMaybe \x -> asum
[ show <$> fromDynamic @Int x
, fromDynamic
@String x
]
>>> f [toDyn (1 :: Int), toDyn "2", toDyn True]
["1", "2"]
что мало отличается от просто суммы (но отличается, можно класть любые типы, и можно доставать разные наборы типов при разных потреблениях, этакая сумма всех типов, но так легко упустить какие-то нужные типы, и компилятор никак не подскажет, только тесты)