Во-первых, forall
здесь лишний:
class MyClass c where
getMyMap :: forall a. c -> MyMap a
Переменные типа без явного связывания универсально квантифицируются на самом внешнем уровне, так что это точно так же, как просто c -> MyMap a
.
Кроме того, универсально квантифицированный тип, безусловно, не будет соответствовать экзистенциально квантифицированному типу. Тип getMyMap
говорит, что при заданном значении типа c
будет создано значение типа MyMap a
для любого возможного выбора типа a
. С другой стороны, метод доступа myMap
говорит, что, учитывая значение типа MyData
, он создаст значение типа MyMap a
для некоторого конкретного, но неизвестного типа a
.
Невозможно, чтобы развернутые экзистенциальные типы плавали сами по себе (для этого потребовался бы квантификатор exists
, соответствующий forall
), поэтому нет способа переписать тип getMyMap
так, чтобы myMap
был корректной реализацией.
Все, что вы можете сделать с чем-то, имеющим экзистенциальный тип, — это обернуть его обратно в другой тип данных, который скрывает квантор существования, или передать его функции, имеющей аргумент универсального кванторного типа. Например, вы можете использовать length
в списке [a]
с a
экзистенциальным типом.
В вашем случае значения Map
имеют экзистенциальный тип без какой-либо другой структуры или ограничений, поэтому они в значительной степени бесполезны и могут также быть ()
.
person
C. A. McCann
schedule
26.10.2012
type
иclass
являются частью модуля, который определяет «API».data
иtype
являются (упрощенными) предварительными реализациями. - person Bruno Grieder   schedule 26.10.2012getMyMap
является такое, которое игнорирует его ввод и каждый раз возвращает пустоеMap
. Я предполагаю, что это не то, что вы хотите, поэтому вы можете переосмыслить цельMyClass
. - person C. A. McCann   schedule 26.10.2012data Map (k :: * -> *) = ...
, а затем у вас будет такая функция, какlookup :: Ord1 k => Map k -> k a -> a
. Теперь, если вы создадите экземпляр параметраMap
для GADT, который уточняет его индексы, вы можете сопоставить разные ключи с разными типами значений. Я написал один из них некоторое время назад, но не могу найти его прямо сейчас. Хотя, возможно, это поможет вам прояснить, чего вы хотите. - person copumpkin   schedule 27.10.2012