169 похожих чатов

Type family RecurseAndCheck a b where RecurseAndCheck a

(HList '[]) = CSat
RecurseAndCheck a (HList ((l :: a) : b)) = RecurseAndCheck a (HList b)
RecurseAndCheck a (HList ((k :: r) : b)) = CNSat
class (forall t (a :: HList t) . RecurseAndCheck (Pair Symbol *) a)
=> Record a

можно это заставить работать?

3 ответов

10 просмотров

Хочу сказать "любой хлист элементы которого принадлежат роду (Symbol, *) это рекорд". Как?

Вы же вроде справшивали про это в багтрекере ghc, вам там правильно сказали что элементы хлиста всегда кайнда Type, a (Symbol, Type) /= Type. Так что проверять что элементы хлиста имеют кайнд (Symbol, Type) бессмысленно - точно не имеют. Чтобы сделать рекорд на хлистe вы можете объявить ньютайп newtype Field (name :: Symbol) typ = Field typ и считать рекордом такой хлист, у которого все типы элементов вида Field _ _ (кайнда Type) . Проверять тогда можно как-то так: type family Check ts where 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 Но лучше конечно сделать как Adam Gundry написал, что-нибудь типа data Record ts where RNil :: Record '[] (:>) :: x -> Record xs -> Record ('(name, x) : xs) Тогда у вас Record является рекордом by construction, никаких проверок не нужно. См. parse, not validate. Или, если вы все-таки хотите сделать на хлисте, например чтобы рекорд можно было использовать как хлист, можно взять более общий хлист параметризованный типом 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 :* Nil

aadaa_ftgaa
Вы же вроде справшивали про это в багтрекере ghc, ...

А сделать общую версию Check возможно? Не хочется писать под каждый кейс. И ещё смежный вопросик - почему стринги не лифтятся автоматом, как это делают числа ?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта