Ввод экзистенциалов в монаду - PullRequest
1 голос
/ 05 ноября 2010

У меня следующая проблема. У меня есть значение типа (forall r. MyType r) и мне нужно ParsecT s u m (forall r. MyType r). Возможно ли это сделать без добавления дополнительных data структур?

1 Ответ

9 голосов
/ 05 ноября 2010

В общем, если у вас есть истинный экзистенциальный тип, он не может "уйти" в более широкую область.Тип (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.В частности, я сомневаюсь, что что-то похожее на тот тип, который вы написали, действительно будет полезно.Хотя я могу ошибаться.

...