ndtimofeev
Haskell Есть ресурс, который аллоцируется вместе с созданием региона (того что у Олега RegionT s pr a). Есть два типа аллокации (для мастера и для всех остальных) и две разновидности функций (для мастера и для всех остальных). Раньше разделение функций работало через специальный дополнительный параметр в регионе: безопасные функции были по нему полиморфны, а опасные нет. Теперь я хочу регионы как у Олега и думаю куда засунуть тег: можно нагородить трансформеров, можно манипулировать с s (что-то вроде RegionT (Impure s) pr a). Первый вариант меня расстраивает, а со вторым я ожидаю какого-то неочевидного отстрела ноги.
ndtimofeev
Haskell Несколько лет назад я придумал управлять состояниями удаленных устройств через волшебные переменные, которые вместо обращения к памяти дергали api устройства. Попользовавшись этим лет пять я понял, что мне нужны разные типы входного и выходного значения, переписал сигнатуру и увидел что-то отдаленно похожее на ConduitT. К чему я это? Какие остались другие живые библиотеки для управления потоками на Haskell?
ndtimofeev
хуюдущее Haskell Пытаюсь создать при помощи .ghci окружение для использования конкретного пакета в интерактивном режиме. Но cabal repl почему-то грузит .ghci до, а не после компиляции модулей пакета, что безусловно очень удобно.
Хорошо. Создаю более другой пакет. В нём линкуюсь со своим пакетом и в .ghci использую его модули. Код выполняется, но символы которые определяются в .ghci в repl'е не видны.
Окей. cabal exec — ghci -package myshit. Теперь наконец работает всё! Если в пути к локальной packagedb нет юникода.
Дальше попытка использовать сандбокс от cabal без помощи cabal, но я уже заебался.
ndtimofeev
ghci Haskell Запускаем долгое вычисление в ghci, жмём ctrl+c, вычисление валится с user interrupt exception. Пишем ей долгий обработчик user interrupt exception, жмём ctrl+c, проваливаемся в хэндлер, жмём ctrl+c и проваливаемся в бездну. Хэндлер по ctrl+c не валится. Окей. Маскирование? Переписываем всё с catch на try. Теперь обработчик ctrl+c точно размаскирован, точно находится в том же треде. Но ctrl+c не ловит.
ndtimofeev
Haskell Для нужды логирования собираю ThreadId отправителя. ThreadId умеет в Show в виде ThreadId и номер треда, что выглядит как говно. Преобразования ThreadId к числовому типу нету. Окей. Лезу в скрытое определение ThreadId. ThraedId это обёртка вокруг СПЕЦИАЛЬНОГО unboxed типа ThreadId# и для его преобразований в число используют специальные приватные функции из недр GHC. Окей, read . drop 9 . show, сука. Статик тайпед май эсс.
L29Ah
Rust ? Haskell github.com
Почему хаскелисты могут въебать сигнатуру где хотят (или вообще не въёбывать чтобы компилятор вывел всё сам), а у раста всегда с этим какие-то сложности? Вон, уже дошло до выпиливания однозначно полезных фичей из языка.
agr
проектное погроммирование дыбр Haskell на радостях закрыл весь бэклог по хаскельному лямбдаботу и выложил все собранные костыли на хакадж: hackage.haskell.org

отдельно удивила архитектура лямбдабота.

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

Следующий бот для телеграма попробую сделать попроще.
ndtimofeev
Haskell А есть какая-нибудь библиотека комбинаторов для генерации случайных значений вроде Gen из QuickCheck только без QuickCheck'а?
qnikst
Haskell а какой самый разумный способ сделать регистрацию промежутка времени, чтобы дождаться его в STM транзакции (или MVer). Я знаю registerDelay из stm, и напрямую GHC.Events, но непонятно, что лучше, а экспериментировать не хочется
qnikst
Haskell а в aeson же нет возможности точно задавать представление для чиселов и лучшее, чего можно добиться это взять scientific, который по своему желанию начнёт превращать значение в scientific notation? Ну разве что руками builder для Encoding делать?
ndtimofeev
Haskell Хочу корутины. Суть такова: нужен трансформер, который позволит добавить к логике в виде последовательности действий добавить точки передачи управления вызывающей стороне с передачей туда информации о прогрессе или типа того. В принципе эта херня подойдёт hackage.haskell.org но возможно есть что-то более общеупотребимое.
ndtimofeev
lsp Haskell Разобрался с haskell-language-server. Разумеется ему для полного счастья нехватало специального файла описывающего проект (hie.yaml). Если зачем он нужен в принципе понять можно, то вот зачем он необходим с учётом того что весь этот цирк умеет сам находить корень довольно заковыристых проектов и есть тулза генерирующая это самое описание на основании информации для сборки проекта понять уже трудно. Также это не позволяет использовать hls вместе со standalone файлами (тот же clangd прекрасно подсасывает стандартную библиотеку в этой ситуации) и ghci-скриптами. Беда.
L29Ah
? Haskell Как попросить ghci нормализовать сигнатуру, в которой присутствуют типо-синонимы и типо-семейства?
ndtimofeev
специальная_олимпиада Haskell Есть у нас строка. Приблизительно такая STIEEQAKTFLDKFNHEAEDLFYQSSLASWNYNTNITEENVQNMNNAGDKWSAFLKEQSTLAQMYPLQEI. Нам нужно сформировать список всех уникальных подстрок этой строки. Ну то есть nub . subsequences, но так чтобы на ноутбуке с 16 гигабайтами памяти завершалось хотя бы за минуту. Считать строку массивом байтов — нельзя.
agr
проектное дыбр Haskell Не прошло и года. В #2980231 я рассказывал об утекающих сокетах и грешил на сервер warp. Сегодня до меня, наконец, дошло, что это мой говнокод приводил к проблемам. Забивались очереди, по которым выстраивались коммуникации между серверными обработчиками запросов и фоновыми процессами.. Стоило затюнить скорость чтения из очередей и поставить метрики размера очередей на мониторинг — и, кажется, проблема ушла, warp ни при чём. А время покажет.
ndtimofeev
Haskell Есть у меня два гетеросписка: один мужественный на GADT'ах с Nil'ом и вот этим вот всем, а второй гейский вида data Cons a b = Cons a b. Как бы мне их терминалогически различать?
ndtimofeev
Haskell Допустим у нас есть библиотека реализующая некоторые статистические инварианты (например библиотека регионов). Допустим я хочу написать тест, который покажет мне что они всё ещё выполняются в соответствии с исходной идеей. Проблема в том, что результатом тестирования должна быть ошибка компиляции. Есть какие-то хорошие решения для прокручивания этого к cabal'у?
agr
дыбр Haskell СЯУ, что при определенных пока не поддающихся упрощению обстоятельствах warp перестаёт закрывать сокеты, оставляя их в close-wait до полного исчерпания. пока не понятно, как нужно составить, отправить и рубануть запрос, чтобы сервер вёл себя так.
ndtimofeev
ghc Haskell У меня такое ощущение что в ubuntu проект собранный при помощи cabal new-install собрался без поддержки -threaded. Что нажать чтобы исправить? А то у меня сервант ставит опердень раком.
L29Ah
говно ? Haskell В программе space leak, но как искать его непонятно: ghc'шный профайлинг говорит, что всё занимается PINNED-памятью (поскольку я оперирую в основном ByteString'ами), и никаких подробностей о том, где она выделена, и что её держит, не говорит — gitlab.haskell.org
Как обычно в таких случаях, алгоритм по-хорошему должен в константной памяти работать, но вместо этого память жрётся и жрётся в ходе работы программы, освобождаясь только в конце.
github.com
Есть ли варианты лучше, чем бинарный поиск по коду методом комментирования? Кажется, в случае хаскеля это вообще так себе метод поиска утечек, поскольку в случае когда мы комментируем какого-нибудь потребителя данных, мы можем ненароком внести ещё один space leak, например когда большой thunk вычисляется по ходу итеративного алгоритма в компактный результат, либо это вычисление откладывается до самого конца, накапливая большие thunk'и в памяти.
agr
code Haskell
type family FragmentUnique api :: Constraint where
  FragmentUnique (sa :<|> sb)       = Or (FragmentUnique sa) (FragmentUnique sb)
  FragmentUnique (Fragment a :> sa) = FragmentNotIn sa (Fragment a :> sa)
  FragmentUnique (x :> sa)          = FragmentUnique sa
  FragmentUnique (Fragment a)       = ()
  FragmentUnique x                  = ()

type family FragmentNotIn api orig :: Constraint where
  FragmentNotIn (sa :<|> sb)       orig =
    And (FragmentNotIn sa orig) (FragmentNotIn sb orig)
  FragmentNotIn (Fragment c :> sa) orig = TypeError (NotUniqueFragmentInApi orig)
  FragmentNotIn (x :> sa)          orig = FragmentNotIn sa orig
  FragmentNotIn (Fragment c)       orig = TypeError (NotUniqueFragmentInApi orig)
  FragmentNotIn x                  orig = ()

type NotUniqueFragmentInApi api =
    'Text "Only one Fragment allowed per api ‘"
    ':<>: 'ShowType api
    ':<>: 'Text "’."
L29Ah
log быдлокодинг Haskell nopython Обнаружил что заебался с однопоточностью тормозной питонопараши и начал переписывать borgbackup на хаскеле. Уже научился пиздеть с удалённым сервером борга и читать метаданные репозитория и архивов, надеюсь на следующей неделе забекаплю уже чонить.
github.com
qnikst
Haskell гинь-гинь прикольно.. во всех библиотеках генерящих csv в хакеле используется одинаковый кусок кода для генерации разных интов, написанный брайаном хрен знает когда, с тех пор появились нормальная реализация builder в bytestring, пакет используют builder, но криво надеясь на специализацию и инлайнинг, которые естественно не срабатывают. И а упростив и уменьшив код можно получить минимум в 2 раза лучшую производительность по CPU (не говорю уже про память)
agr
Haskell интересно, а есть ли живые примеры серверов на серванте, у которых в индексе свыше 100000 страниц с контентом?