2015-01-11 1 views
3

Я играю с функцией -XDataKinds от Haskell довольно недавно, и я обнаружил, что хочу создать вид.Объявление и работа с типами в Haskell

Я не уверен, если мои желания могут сбыться, но от Эдварда Kmett-х constraints package, там, кажется, объявленного вида Constraint (с родом BOX), который говорит, что должны быть определен в GHC.Prim, но я не мог найти Это.

Есть ли способ объявить вид в Haskell или GHC вручную? Это, вероятно, потребует ручного подтверждения того, что типы данных, объявленные с data, будут иметь надлежащий вид. Моя идея что-то вроде следующего:

data Foo :: BOX 

data Bar a :: Foo where 
    Bar :: a -> Bar a 
+3

Использование 'DataKinds' означает, что каждое объявление данных создает новый вид, не так ли? например 'данные Nat = Z | S Nat' создает новый вид 'Nat', населенный типами: Z :: Nat' и' S :: Nat -> Nat'. –

+0

Это правильно, но только если продвинутый тип является правильным типом данных Haskell98. В моем случае я обнаружил, что мне нужно продвигать то, что выглядит как «данные Foo (x :: Bar) (y :: Bar) = Foo | ... ', где' Bar' - это своего рода. Это не будет способствовать использованию '-XDataKinds' - мне нужно будет _manually_ продвигать его с тем же именем. Это также было бы очень полезно для желающих продвигать GADT. –

+2

Я читал ваш вопрос несколько раз, и у меня возникли проблемы с выяснением того, что вам нужно/предлагать. Кажется, это похоже на то, что вы просите объявить новый вид, населенный некоторыми новыми типами, которые сами проживают на уровне термина, что на данный момент невозможно. Это то, о чем вы просите, или что-то еще? Если это что-то еще, маленький случай использования будет достаточно освещен. Что касается продвижения GADT, я считаю, что это открытый вопрос исследования. –

ответ

1

В текущем GHC (7.8 на момент написания), один не может отделить декларацию в свежем виде из декларации его жителей типа уровня.

+0

Системы, подобные Agda, помогают облегчить эту потребность, правильно? –

+2

@AthanClark Я не эксперт Agda, и я не знаю, поддерживает ли он объявление открытых типов (при более высоких стратах) или нет. Я был бы удивлен, если бы это произошло. –