Как я могу узнать, какие (конкретные) типы удовлетворяют набору ограничений типов?

Учитывая ряд ограничений типа:

{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses #-}
import Data.Array.Unboxed(Ix,IArray,UArray)

type IntLike a = (Ord a, Num a, Enum a, Show a, Ix a, IArray UArray a)

Как узнать, какие типы удовлетворяют IntLike, т.е. все упомянутые ограничения совместно?

Я могу скомпоновать информацию, необходимую из вывода команды ghci :info, а затем дважды проверить мою работу, позвонив (или имея ghci typecheck)

isIntLike :: IntLike -> Bool
isIntLike = const True

в различных типах, например. isIntLike (3::Int).

Есть ли способ заставить ghci сделать это для меня?

В настоящее время я заинтересован в конкретных типах, но не хотел бы иметь более общее решение, которое также делает умные вещи с объединяющими контекстами!

Ответ 1

Ответ сообщества Wiki на основе комментариев:

Вы можете сделать это, используя шаблон haskell.

main = print $(reify ''Show >>= stringE . show).

Это не будет работать для синонимов типов - скорее, reify возвращает AST, представляющий сам синоним типа, без его расширения. Вы можете проверить синонимы типов, которые являются ограничениями, извлечь ограничения, из которых состоит синоним этого типа, и продолжить их повторное использование.