-
data F = A | B | C
есть
data M (a::F) = M (Ptr (M a))
есть
data SM = forall a . M a
есть (по смыслу)
typeOf :: SM -> F
какой магией тепеь сделать case split по SM так чтобы было что-то вроде:
case typeOf sm of
A -> тут бы выводилось, что у нас M a
Replies (25)
-
@qnikst, Если из юнион в хаскелле строчку получаешь — можно запилить два тайпкласса, один будет class M (u :: Symbol) a | u -> a, a -> u`, другой class ReduceM (a :: [*]) и у него два инстанса, один instance ReduceM '[], другой instance (M s a, ReduceM as, KnownSymbol s) => (a ': as) с нужными констрейнтами. В инстансе для (a ': as) делаешь symbolVal по `s` и сравниваешь с тем что из юниона пришло. Успех — возвращаешь что надо, неуспех — рекурсивно зовешь.