AA
Size: a a a
AA
IO
Type, a (Symbol, Type) /= Type. Так что проверять что элементы хлиста имеют кайнд (Symbol, Type) бессмысленно - точно не имеют.newtype Field (name :: Symbol) typ = Field typи считать рекордом такой хлист, у которого все типы элементов вида
Field _ _ (кайнда Type) . Проверять тогда можно как-то так:type family Check ts whereНо лучше конечно сделать как Adam Gundry написал, что-нибудь типа
Check (HList '[]) = () :: Constraint
Check (HList (Field _ _:r)) = Check (HList r)
Check (HList (t:_)) = TypeError ('Text "Non-Field type in record: " ':<>: 'ShowType t)
class Check ts => Record ts
instance Check ts => Record ts
data Record ts whereТогда у вас Record является рекордом by construction, никаких проверок не нужно. См. parse, not validate.
RNil :: Record '[]
(:>) :: x -> Record xs -> Record ('(name, x) : xs)
f:-- Data.SOP.NP из sop-core, NP Identity ~= HList
data NP f xs where
Nil :: NP f '[]
(:*) :: f x -> NP f xs -> NP f (x:xs)
infixr 5 :*
type Snd :: (a, b) -> b
type family Snd t where
Snd '(_, b) = b
newtype Field nt = Field (Snd nt)
type Record = NP Field
foo :: Record [ '("foo", Bool), '("bar", Int) ]
foo = Field True :* Field 1 :* NilS
Type, a (Symbol, Type) /= Type. Так что проверять что элементы хлиста имеют кайнд (Symbol, Type) бессмысленно - точно не имеют.newtype Field (name :: Symbol) typ = Field typи считать рекордом такой хлист, у которого все типы элементов вида
Field _ _ (кайнда Type) . Проверять тогда можно как-то так:type family Check ts whereНо лучше конечно сделать как Adam Gundry написал, что-нибудь типа
Check (HList '[]) = () :: Constraint
Check (HList (Field _ _:r)) = Check (HList r)
Check (HList (t:_)) = TypeError ('Text "Non-Field type in record: " ':<>: 'ShowType t)
class Check ts => Record ts
instance Check ts => Record ts
data Record ts whereТогда у вас Record является рекордом by construction, никаких проверок не нужно. См. parse, not validate.
RNil :: Record '[]
(:>) :: x -> Record xs -> Record ('(name, x) : xs)
f:-- Data.SOP.NP из sop-core, NP Identity ~= HList
data NP f xs where
Nil :: NP f '[]
(:*) :: f x -> NP f xs -> NP f (x:xs)
infixr 5 :*
type Snd :: (a, b) -> b
type family Snd t where
Snd '(_, b) = b
newtype Field nt = Field (Snd nt)
type Record = NP Field
foo :: Record [ '("foo", Bool), '("bar", Int) ]
foo = Field True :* Field 1 :* NilIO
ЗП
JS
ЗП
Prelude> :t "Test"
"Test" :: [Char]
Prelude> :kind! "Test"
"Test" :: GHC.Types.Symbol
= "Test"
S
к
S
ЗП
ЗП
forall как-то от Proxy избавиться?type (~>) f g = Proxy f -> Proxy g -> Type