ndtimofeev

А есть в рантайме ghc костыль чтобы посмотреть на жизненный цикл всех запущенных тредов? Не... Я конечно могу написать свой async, но хотелось бы до этого не доводить.

ndtimofeev

Добавил роботу немного кококонкурентности. Процесс был очень волнительный поскольку reload был очень hot. Но оказалось что конкурентность воткнутая за пол часа работает как часы. А вот функции стандартной библиотеки я за время перекладывания бумажек с места на место забыл. Ну и логгер стал показывать не то что нужно от жизни такой. Заодно немного почистил в коде амфапарашу доставшуюся мне от меня из прошлого.

agr

`IORef Settings` в прилoжении, где Settings — целикoм читаются из пачки dhall файлoв, — лютейший вин!
эдакий hot reloading версия лайт.
не счесть, скoлькo нервoв и времени сэкoнoмленo!

blaze

Вышел network-3.0.0.0
Мне пришли люли за то, что не поставил upper bound в спеке и сломалась сборка моего пакета на hackage.
Полез чинить.
Нашел ебаный пиздец как они год этого не заметили в network-3.0.0.0 : github.com Любые ошибки в connect тупо теряются, исключение прилетит только на следующем вызове. Впрочем, понятно как: никто не делает важных действий между connect и send, они один за другим идут обычно. Это мне с тестами повезло, от автора пакета остались.

agr

первую страницу налабал на новом фреймворке:
— 1 тип данных рендерится,
— 10 разных рекордов
— 4 вида элемента
— 5 событий
— рендеринг через blaze-html
— если проводить аналогию с Data.Aeson, то для "Value" ещё не покрыт "Object".
— куча бойлерплейта.
— связь событий с моделью прописывается отдельно, т.е. потенциально: "забыл", и привет баги в рантайме.. надо думать новый констрейнт, чтобы прямо в MarkupM (или обёртке) можно было события назначать, ну чтобы хотя бы как в пурскрипте.

слишком много размерностей и возможностей в каждой из них (многомерная хрень).. надо каждый случай покрывать примерами (сильно потом)..
складывается впечатление, что надо делать отдельный сайт, по типу вебшарпера..
описывать в туториале все размерности и то, как ими пользоваться..

под размерностями я понимаю:

1. модель коммуникации
— broadcast/multicast
— выделенная сессия
2. реализации MVC концепта, нужны примеры (список простых примеров уже есть, бери и делай)
3. формат данных:
— текстовый (+)
— бинарный (на следующей странице обкатаю)
4. клиентские (JavaScript) события (условно, тысячи их.. это целый мир джаваскрипта, на который я замахнулся). Пока покрыто лишь 5.

max630

stackoverflow.com

Вот пример почему в языке должны быть исключения из коробки а не троллейбус из хлеба. Если б всё было как надо dsReify зафейлился бы с исключением что именно и где не нашлось, и его можно было бы прямо так и передать юзеру, или завернуть в своё если уж так приспичило. Но по-моему можно было бы и не заворачивать, тот явный фейл что там есть это отчаянная попытка сузить поиск проблемы хотя бы до пакета. А так вот: cannot find a type, и сиди дебажь что он там не смог найти.

И ведь если сейчас даже что-то там заимплементировать — всё равно код уже отравлен многочисленными ручными перебросами, и это не будет работать как должно.

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.

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