Есть ли разница между этими двумя декларациями GADT?
data A a b where
...
data A :: * -> * -> * where
...
Есть ли разница между этими двумя декларациями GADT?
data A a b where
...
data A :: * -> * -> * where
...
Нет никакой разницы. Можно подумать, что не упоминать переменные типа в заголовке было бы необходимо, чтобы использовать для них разные имена в сигнатурах конструктора, например:
data A :: * -> * -> * where
AN :: Num x => x -> b -> A x b
AS :: IsString s => s -> b -> A s b
Однако, поскольку Руководство пользователя GHC говорит...
В отличие от объявления типа данных в стиле Haskell-98, переменные типа в заголовке
data Set a where
не имеют области видимости.
... и так это тоже работает:
data A a b where
AN :: Num x => x -> b -> A x b
AS :: IsString s => s -> b -> A s b
type family A :: * -> * -> *
иtype family A a :: * -> *
- первый допускает такие экземпляры, какA Int Bool = Char ; A Int Char = Bool
, а последний - нет, допуская только, например.A Int = Maybe
. (имяa
пока неактуально, правда вtype family A a :: * -> *
) - person chi   schedule 24.11.2016type family B b :: *
не позволяет вам использовать, например.MaybeT B a
, что возможно сtype family B :: * -> *
. Первый будет приложением синонима частичного типа. (LiberalTypeSynonyms
иногда может обойти это ограничение.) - person leftaroundabout   schedule 24.11.2016TypeInType
- вы не можете писать, например,X :: (a :: k) -> P a -> *
, покаX (a :: k) (p :: P a)
действителен. Существует также разница в том, какие параметры kind на самом деле являются индексами (опять же только сTypeInType
) - объявлениеdata X0 :: Fin n -> * where X0 :: X0 Fz
недопустимо (посколькуn
на самом деле является параметром, аX0
не является параметрическим вn
) , в то время какdata X0 (q :: Fin n) where X0 :: X0 Fz
действителен. Однакоdata X0 :: forall n . Fin n -> *
также делаетn
индексом. - person user2407038   schedule 25.11.2016data X1 :: k -> *
является параметрическим для видаk
, но без TypeInType он индексируется для видаk
. И еще...data X2 :: forall k . k -> forall k' . k' -> *
иdata X2 :: forall k . k -> forall k' . k' -> *
имеют совершенно разные виды - суждениеX1 ~ X2
даже плохо типизировано! Но дажеX2
невозможно выразить с помощью первого синтаксиса. Везде в Haskell (за исключением, возможно, TypeApplications) порядокforall
связанных переменных типа не имеет значения. - person user2407038   schedule 25.11.2016TypeInType
. Вы можете превратить свои комментарии в расширенный ответ. - person chi   schedule 25.11.2016