Грубо говоря обычный полиморфизм - это когда ваш тип высшего порядка не имеет права анализировать свой аргумент.
Т.е. есть параметрические типы данных, есть какие-то алиасы, которые анализировать свой аргумент не могут, могут только передать аргумент в какой-то другой тип высшего порядка.
Очевидно такая "тайплямбда" может определить не очень сложную логику, никакой интересной программы на ней не напишешь.
Но когда появляются match-types, type families вы можете определить тип высшего порядка, который будет анализировать структуры ваших аргументов нетривиальным образов.
Фактически это позволяет написать программу, вычисляющую типы сложным образом, что уже может быть использовано для вашего компилятора, когда к сложным типам цепляются сложные экземпляры.
Иными словами, это позволяет писать программы, которые будет запускать ваш компилятор, генерируя конструкты, которые будут использованы как часть ваших программ.
Если такие программы могут быть довольно сложными, это и можно назвать "метапрограммированием"
На матч-тайпах и семействах типов, такие программы могут с должными расширениями быть тюринг-полными, значит достаточно сложными