В общем, если у вас есть истинный экзистенциальный тип, он не может "уйти" в более широкую область.Тип (forall r. MyType r)
означает «это MyType r
для любого r
, который вы можете придумать», очень похоже на Nothing
типа forall a. Maybe a
;это не значит, что существует какой-то неизвестный r
такой, что у вас есть MyType
.
Если вы действительно хотите полиморфный термин, это совсем другое дело, но я предполагаю, что вы действительнодействительно означает экзистенциальный.
Как я уже упоминал в комментариях к этому вопросу, экзистенциальные типы представляют значение с определенным, но неизвестным типом.Поскольку вы не знаете тип, все, что вы можете сделать с таким значением, это применить к нему функцию, которая полиморфна в своем аргументе.Нет никакого способа напрямую говорить о экзистенциальном типе, поэтому краткий ответ на ваш вопрос: Нет.
Чтобы манипулировать экзистенциальным типом, вы можете либо скрыть их внутри продолжения с типом, подобным forall t. (forall r. MyType r -> t) -> t
или скрыть их в структуре данных, например data ExistMyType = forall r. ExistMyType (MyType r)
.Фактически, это в значительной степени одно и то же, поскольку продолжение сводится к кодированию Церковью типа данных.
Но, честно говоря, я подозреваю, что то, что вы действительно должны сделать, - это пересмотреть вашеподход.Экзистенциальные типы неудобны, немного сбивают с толку и, как правило, не лучшее решение в Haskell.В частности, я сомневаюсь, что что-то похожее на тот тип, который вы написали, действительно будет полезно.Хотя я могу ошибаться.