agr

одолел, короче, эту ботву с базой пакетов. есть замечательный пакет ghc-paths. в нём пути к тулам определяются через переменные окружения, например, GHC_PACKAGE_PATH.
cabal-install, ghc и ghc-pkg растут и развиваются. и тут приходит стэк и начинает переписывать переменные окружения, т.к. у него есть минимум 2 базы пакетов (от снапшота, компилятора) в ~/.stack. ещё есть ~/.../.stack-work. там тоже есть, да. по ходу дела во время билда stack делает своё страшное дело и затирает HASKELL_SANDBOX_CONFIG, устанавливая его в базу пакетов снэпшота (!). вот это вообще ни разу не тривиально. я думал, что "песочница" — это база локальная, из .stack-work. а оказалось, что нет. снэпшот — это песочница. таким образом, все extra-deps, которые кладутся в .stack-work, остаются не удел и не видны.

придумал вообще рабочий костыль.
если вижу в пути ".stack", то пускаю "stack exec — ", иначе — оставляю значение из ghc-paths (либо дефолтное).

segfault

Вот вы говорите что Haskell это приседания, что его долго изучать, что он сложный. Я на весь Haskell вместе с монадами потратил 2 недели в 2012 еще, а деривейшены на nix-language уже 3 неделю пытаюсь научиться писать, и до сих пор не понимаю как они работают вообще работают. Модный динамический, простой в использовании кудах кукарек.

den-po

попробовал перевести. с предметом знаком не особо тесно, сильно не ругайте

User: Привет, я бы хотел услышать шутку про Haskell.
Haskell: Ок. Почему курица переходит дорогу?
User: Не знаю. Почему?
Haskell: Это на самом деле очень просто. Лучший способ понять это исходит из идеи контравариантного функтора. Как вы возможно знаете, функтор это всего лишь отображение из одной категории в другую с сохранением структуры категории; гомоморфизм между категориями, если хотите. Теперь, некоторые конструкции, которые мы хотим выразить, выглядят как функторы но в некотором смысле "поворачивают морфизмы наоборот". Мы называем это контравариантыми функторами. Как вы возможно заметили, мы безусловно можем определить контравариантный функтор как просто ковариантный функтор из двойственной категории, если ссылаться на очевидное соответствие. Конечно, вы уже заметили очевидную связь, которую это имеет с обобщением топологических предпучков теории категорий — предпучок на категории это всего лишь контравариантный функтор из частично упорядоченного множества открытых множеств в категорию множеств. Теперь, становится очевидно, что...

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

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