qnikst

зопилил тест который запускает explain на все sql запросы, пока не сохраняет в файлик, а только проверяет корректность того, что все отрабатывает. Когда-нибудь когда будет время нужно будет превратить это в source плагин, чтобы ручной работы не было совсем.

agr

Решил, наконец, поиграться в метамодельки. Веселье заключается в том, что каждому рекорду соответствует ещё его метадата. В связи с чем, возникает хороший вопрос... Допустим, у меня есть тип данных A с именем объекта (aName) и ещё 8 рекордами (aParam1 .. aParam8). Поскольку я помимо данных из базы тяну ещё и метаданные, по которым их идентифицировать, и не люблю ддосить базу, то мне надо вытащить за раз одним селектом 19 полей (имя, идентификатор и тип объекта (3) + параметр и его айдишник x 8 (16)) из базы. Persistent со своим RawSql отваливается на подступах с 8 колонками.

postgresql-query потянет? или что-т другое?

agr

хочется странного.
1. host=osx.
2. stack docker собираю под линукс
3. в локальной pkg-db, соответствующей ghc-8.4.3-linux, есть пакет, лежит в .stack-work внутри соответственно.
4. в глобальной pkg-db, соответствующей ghc-8.4.3-linux, нету этого пакета.
5. в родительском пакете юзается ghc-paths, в котором явно триггерится ghc-pkg. опытным путём было установлено, что глобальный.

как поместить пакет из local db в global db?

сейчас проект собирается с хаком:

export GHC_PACKAGE_PATH=$(stack path --ghc-package-path)

SannySanoff

А вот в Хаскеле partial application убогий:

f x y z = x + y * z;

а хочешь частично применить только x и z — и болт: изгаляйся. f1 x z y = f x y z; q = f 10 3; q 2

В kdb+ веселуха,

f:{[x;y;z]x+y*z} — определение ф-ии
var1:f[10;;3] — частичное применение, параметры разделяются ";".
(Ну а если последние параметры надо оставить висяком, то и точки с запятыми тоже не нужны).
var1[1] — дает 13
var1[2] — дает 16

короче, пока я не узнал, все ломал голову, где же функция flip.

А вот на тебе, на лопате, не подавись!

qnikst

1. приложение выдает 1к rps и тормозит, как не должно
2. добавляешь в контейнер GHCRTS=-N4
3. приложение выдает 4.5к rps

оптимизация like a boss, а в го бы пришлось вручную память менеджерить.

gbdj

Ах вот оказывается для чего они запилили GADT: "to construct a safe list type for which the equivalent of head [] fails to typecheck and thus does not give the usual runtime error: *** Exception: Prelude.head: empty list". Хорошо надрачивают! Уже думаю пора пойти посмотреть что полезного можно сделать при помощи линеаризованных типов. Понятно что след за утечками памяти в прошлое уйдет и сборщик мусора, но вот можно ли будет так с ними жить...

gbdj

Наконец нормальное разъяснение контравариантных функторов typeclasses.com . Главное тут написано где надо, а главное где не надо искать этот паттерн. Как только осознаешь что речь идет про морфизмы по сути своей сводящимися к (-> z) сразу перестаешь ломать голову как же блин построить обратную функцию, а начинаешь уже думать в контексте функциональной композиции. Нет путаницы в примерах когда не понятно кто из этих конкретных типов в предикате на самом деле свободных параметр или что в каждом контексте значит тип a

gbdj

Поскольку голове несколько полегчало, то в планах на вечер вешить хаскелевую задачку на доказательство леммы Yoneda. codewars.com Чтоб показать изоморвизм надо среди прочего, судя по необходимому типу, определить контравариантный функтор (a -> b) -> f b -> f a И если на диаграмке со стрелочками еще можно сообразить почему он должен существовать, то как реализовать его в реальности да еще и параметрически полиморфным образом мыслей пока нет.

gbdj

А я правильно понимаю что даже если граф ациклический, то все равно надо забить на алгебраические структуры данных? При модификации стоит просто идентифицировать ноду по уникальной метке/индексу? В моем случае структура графа не меняется, но меняется содержимое ноды после каждого суска. Как лаконичнее в этом случае описать структуру данных?