В последнее время я много играл с функцией Haskell -XDataKinds
и обнаружил, что хочу создать своего рода.
Я не уверен, что мои желания сбудутся, но из constraints package, кажется, есть объявленный тип Constraint
(с сортировкой BOX
), который, как сказано, определен в GHC.Prim
, но я не смог его найти.
Есть ли способ объявить вид в Haskell или GHC вручную? Это, вероятно, потребует ручного подтверждения того, что типы данных, объявленные с помощью data
, будут надлежащего типа. Моя идея примерно следующая:
data Foo :: BOX
data Bar a :: Foo where
Bar :: a -> Bar a
DataKinds
означает, что каждое объявление данных создает новый вид, не так ли? напримерdata Nat = Z | S Nat
создает новый видNat
, населенный типамиZ :: Nat
иS :: Nat -> Nat
. - person Daniel Wagner   schedule 12.01.2015data Foo (x :: Bar) (y :: Bar) = Foo | ...
, гдеBar
— тип. Это не будет продвигаться с помощью-XDataKinds
— мне нужно вручную продвигать его с теми же именами. Это также было бы очень полезно для продвижения GADT. - person Athan Clark   schedule 12.01.2015data FooKind :: BOX where
, затемdata Bar a :: FooKind where ...
. - person Athan Clark   schedule 12.01.2015k1 -> ... kN -> *
иk1 -> ... -> kM -> Constraint
. Насколько я знаю, ответ - нет. Все остальные типы в GHC возникают как продвижение (закрытых) типов данных. - person Lambdageek   schedule 12.01.2015