Я не уверен, что так я хочу, чтобы мой дизайн действительно выглядел, но есть ли способ получить мой GADT, чтобы увидеть, что аргумент mt
должен иметь вид MarketType
, потому что он является аргументом типа до MarketIndex
?Получение datakind признано в GADT
Я думаю, что текущий контроль типов будет mt :: *
так MarketIndex mt
выходит из строя, а не мы должны Bulid в MarketIndex mt
в какой-то момент так необходимо ограничить mt :: MarketType
.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Market.TypesDK where
data MarketType = WinDrawWin
| AsianHandicap
deriving (Show)
type family MarketIndex (mt :: MarketType) :: *
type instance MarketIndex WinDrawWin =()
type instance MarketIndex AsianHandicap = Double
data Market :: MarketType -> * where
Instance :: mt -> MarketIndex mt -> Market mt
Ошибки я получаю:
[1 of 1] Compiling Market.TypesDK (TypesDK.hs, interpreted)
TypesDK.hs:32:33:
The first argument of ‘MarketIndex’ should have kind ‘MarketType’,
but ‘mt’ has kind ‘*’
In the type ‘MarketIndex mt’
In the definition of data constructor ‘Instance’
In the data declaration for ‘Market’
Failed, modules loaded: none.
Может быть, у меня есть синтаксис неправильно, или, может быть, я прошу слишком много?
Ах да, спасибо! Я даже читал «Зависимое программирование с помощью синглтонов» несколько месяцев назад, когда впервые посмотрел на все это, но я, очевидно, ничего не помнил. Время для другого читать ... – dbeacham
Взгляните на пакет 'singleletons', который будет генерировать для вас все такие однотипные однотипные типы. – user2407038