Можно ли сравнивать два типа, если их можно назначить другому?

Скажем, у меня есть два types:

t1 <- [t| (Functor f) => (a -> b) -> f a -> f b |]
t2 <- [t| (Int -> Char) -> [Int] -> [Char] |]

Можно ли в шаблоне Haskell определить, что выражение t1 также может быть t2? (Без внедрения унификации типов).

Ответы

Ответ 1

Как говорит jberryman в комментариях, вы можете сгенерировать код, который заставит typechecker объединить два типа. Тем не менее, вы не можете запираться в typechecker, чтобы убедиться, что вы сами и ответили на результат. У вас просто нет надлежащего доступа к полной среде typechecker на этапе расширения TH.

Ответ 2

Да, вы можете вывести всю другую переменную в самый абстрактный класс, который используется