Может ли кто-нибудь объяснить или предположить мотивы ограничения на продвижение типов данных, обсуждаемого в разделе 7.9.2. руководства пользователя GHC?
На продвижение действуют следующие ограничения:
- Мы продвигаем только те типы данных, виды которых имеют вид
* -> ... -> * -> *
. В частности, мы не продвигаем типы данных более высокого типа, такие какdata Fix f = In (f (Fix f))
, или типы данных, виды которых включают расширенные типы, такие какVec :: * -> Nat -> *
.
В частности, меня интересует последняя часть о продвигаемых типах, таких как Vec :: * -> Nat -> *
. Продвижение некоторых типов вроде этого кажется естественным. Я столкнулся с этим довольно быстро, когда пытался преобразовать одну из моих библиотек для использования определенных продвинутых типов для различных типов фантомов вместо использования типа *
для всего, чтобы предоставить лучшую документацию и тому подобное.
Часто причины подобных ограничений компилятора бросаются в глаза, если немного подумать, но я не вижу этой причины. Поэтому мне интересно, входит ли это в категорию «еще не нужно, поэтому мы его не строили» или «это невозможно/неразрешимо/разрушает вывод».