Denis
то драйвер для базы кривой, то только на нагрузке проявляется
Anatolii
ну так вероятность увеличивается
Anatolii
и понять что пошло не так будет чуток сложнее
Denis
на другой базе вообще смысла не вижу тестить
Anatolii
там еще аргумент - "с инмемори базой тесты быстрее идут"
Anatolii
не понятно куда спешим
Denis
ну и в кросс-базовыми ORM все плохо, т.к. базу выбираешь обычно ради её уникальных фич, а не общего функционала со всеми остальными
Denis
а в подобных решениях специфические фичи не поюзаешь, ради сомнительной поддержки кучи стореджей
Alexander
а мне ещё не нравится маппинг на объекты автоматом
Alexander
во всяких орм
Cheese
Vladislav
Если экзистенциально обернуть Data.Type.Equality, останется Proxy
Vladislav
А если дважды обернуть, то ()
parket
A что мы вообще с экзистенциальным типом можем делать? Мы же не знаем, какой это конкретно тип?
A64m
иногда это же только на пользу
Denis
мы можем “что-то” о нем знать и поэтому можем то же “что-то” делать
Denis
например мы знаем что это экзистенциальный тип, который может превращаться в картошку
A64m
например, благодаря этому можно тайпчекать длины фиксированных векторов, которые от входных данных зависят и т.д.
Denis
поэтому мы можем использовать бульбоморфизмы, даже не зная больших деталей
Vladislav
Если дан какой-то экзистенциальный тип e, то в контексте может быть некий констрейнт Foo e предоставляющий операции над ним (как @catamorphism говорит). И эти констрейнты могут отличаться в разных ветках кейса если использовать GADT-ы (как @A64m_qb0 упомянул на примере с длиной вектора)
Vladislav
К тому же кому в положительной позиции existential, а кому в отрицательной universal
Vladislav
Если функция f :: forall a. a -> a то она тоже ничего про a не знает
Vladislav
если f :: forall a. Foo a => a -> a то знает Foo
Vladislav
если f :: forall a. a ~ Int => a -> a то уже и конкретный тип знает
Vladislav
экзистенциальность дает возможность неизвестный тип не принять, а вернуть
Vladislav
skolem он и есть skolem (выбрали за нас), вне зависимости от квантификатора
parket
Vladislav
это какой-то параметрический рефлекс?
parket
Vladislav
жаль Haskell нетотальный и f имеет бесконечно много операционно разных реализаций
Vladislav
(денотационно одинаковых, но это ровно до ближайшего catch)
Vladislav
через CPS или обертку
Vladislav
Рассмотри функцию f :: A -> B, ты ее можешь переписать как f :: A -> (B -> r) -> r
A64m
A64m
всегда можно еще один id прикомпозить и получить очередную завершающуюся имплементацию id
parket
Vladislav
Потому что если есть f :: A -> B, то есть f' :: A -> (B -> r) -> r) где f' a cont = cont (f a)
Vladislav
чисто механическое преобразование
Denis
Vladislav
если с f ты будешь получать результат и биндить его в let типа такого:
let x = f a
in DoStuffWith(x)
то с f' ты будешь передавать continuation как аргумент:
f' a $ \x -> DoStuffWith(x)
parket
A64m
Vladislav
Так вот, если ты хочешь, чтобы внутри возвращаемый B был неизвестным типом, то в случае с f тебе нужен новый квантификатор (f :: exists e. A -> e), а в случае в f' ты используешь forall — f' :: A -> (forall e. e -> r) -> r
Vladislav
Потому что exists в положительной позиции превращается в forall в отрицательной
Vladislav
Экзистенциальные обертки дают примерно тот же самый эффект. forall при конструировании дает exists при деконструировании
Vladislav
Инуитивно: если функция может вернуть что угодно (exists), то continuation должен уметь принять что угодно (forall). Если в конструктор можем положить что угодно (forall), то при матчинге должны уметь обработать что угодно (exists)
parket
Очень круто. Я не всё понял, но постараюсь. Что почитать, чтоб не разводить флуд? Желательно попроще. Я JS-ер 🤣
Denis
мы по юзерпику поняли
parket
parket
А, собачка? :)
A64m
а по моему юзерпику какой язык определяется?
parket
melvin
A64m
на увеличенной версии клавиатура под апл не подходит
Vladislav
Vladislav
согласно Лурку
parket
Стереотипный, скорее :)
Denis
я в твиттере и похуже видел
PsyDebug
Aliester
типичный программист на Хаскеле - накачанный полубог - техлид
parket
Vladislav
parket
Aliester
а теперь все скукожились в хикка-гиканов?
Vladislav
да, потому что lift перестали использовать
Aliester
не liftят, lensами зрение портят
Vladislav
точно
Vladislav
совпадение? не думаю.
A64m
до mtl не было ничего
parket
Кстати, что за хайп такой вокруг этих Lens?
Vladislav
Потому что в Haskell забыли человеческие record updates подвезти
A64m
это такая библиотека, ради написания которой хаскель и придумали, но 20 лет не могли осилить написание
Vladislav
А потом Kmett решил исправить это так, что решил еще 30 проблем и вылечил рак
Vladislav
получились lens
Aleksei (astynax)
"- А что, вы и лифтить за меня будите?"
parket