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 ответов

5 просмотров

Хочу сказать "любой хлист элементы которого принадлежат роду (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 возможно? Не хочется писать под каждый кейс. И ещё смежный вопросик - почему стринги не лифтятся автоматом, как это делают числа ?

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

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

А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
32
Hello. Could you please help me with finding all coordinates within a radius using a spatial index, given that I have a table with coordinates? SET @lng = 37.57925; SET @lat ...
Rinchin G
7
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Всех приветствую. Направьте меня в нужное русло. Постепенно переписываю проект с delphi на lazarus. Приложение - обычный windows/linux клиент для бд firebird. Тут все хорошо. ...
Mishutka
8
Привет всем, подскажите, есть сайт на ево 1.4, надо сделать его мультиязычным, структура документов одинаковой останется, чисто тексты разные, свои тв для каждого языка, поддо...
Oleg
7
@rouse_79 https://github.com/AlexanderBagel/FWZip/blob/8c6882a31ffaa9a23e66e22eaa5b1f7ebfcad43c/zlib_external.pas#L393 Почему Си-шная функция memset, параметр отвечающий за з...
notme
8
{"fieldValue":[ {"title":"Alkmaar","coords":"52.62689992095562, 4.771862510168792","address":"Edisonweg 1","zip":"1821 BN","city":"Alkmaar","description":"ma-vr: 07:00-17:00"...
Marc Hoogstrate
4
А что ты ставишь? Релиз или текущую версию?
Aliaksandr Sadouski
9
Карта сайта