Cheese
так типы полиморфные же
не всегда. можно решить задачу хотя бы для случая известных типов
A64m
ну и у макбрайда же еще куча синтаксиса для pure *> <* join
кана
когда-нибудь lens установится
Leonid 🦇
или нет
eahqzsr
Какие вообще практические применения у applicative?
Ilya
Любая монада -- аппликатив
Ilya
Так что практические применения такие же, плюс ещё
eahqzsr
Я конечно имел в виду аппликативы не являющиеся монадами
Ilya
Validation http://hackage.haskell.org/package/validation
Ilya
Const
Ilya
ZipList уже упомянутый
Ilya
Хотя я лично придерживаюсь точки зрения, что зиповать правильнее вектора, а вектор уже монада
Ilya
Есть эффективная реализация парсерных комбинаторов, которые аппликатив, но не монада
Ilya
Там грамматика, правда, по моему LL(1)
Зигохистоморфный
моноидальные парсера
Ilya
Моноидальные -- это по моему несколько другое
Ilya
Там были именно аппликативные
Ilya
Но почему-то на хаккадже я не нашёл
Ilya
bind, такой что ap это zip
А почему для списка так нельзя сделать?
Ilya
Чем вектор так отличается
Ilya
А ссылку можно кстати?
https://github.com/aistrate/Articles/blob/master/Haskell/Deterministic,%20Error-Correcting%20Combinator%20Parsers%20(Swierstra,%20Duponcheel).pdf
A64m
Я конечно имел в виду аппликативы не являющиеся монадами
практическая ценность в том, что Applicative менее строгий констрейнт, так что дает возможности, вроде линз или параллельного вычисления
Ilya
Чем вектор так отличается
нет гарантированной длины, bind для вектора вычисляет f на каждом элементе и берет диагональ.
Ilya
с листом f может пустой список вернуть
Зигохистоморфный
@ilya_yanok это? http://hackage.haskell.org/package/applicative-parsec
Ilya
нет гарантированной длины, bind для вектора вычисляет f на каждом элементе и берет диагональ.
А, ты имеешь в виду тип = вектор фиксированной длины? Не Data.Vector
Ilya
да, сорри что не уточнил
Ilya
Теперь понятно, спасибо
Ilya
@ilya_yanok это? http://hackage.haskell.org/package/applicative-parsec
сложно сказать. Реализация выглядит другой. А определить сходу эквивалентная или нет я не могу
Cheese
https://hackage.haskell.org/package/regex-applicative
Ilya
практическая ценность в том, что Applicative менее строгий констрейнт, так что дает возможности, вроде линз или параллельного вычисления
Когда уже люди будут учить хаскель из-за скорости, а не из желания "прочистить мозги"
Ilya
Как чего, программ
Евгений
Написания продукта
Евгений
Ну, гм, хаскель быстрее только других языков для прочистки мозгов
Ilya
Быстрое написание быстрых программ
eahqzsr
Звучит как раст
Наверное нужно добавить "и чтоб кровь из глаз не шла"
Евгений
Когда уже к расту нормальный синтаксис прикрутят :(
Leonid 🦇
Can't burrow immutably, mutable borrow at this point huita.rs::1488:42
Leonid 🦇
Быстрое написание быстрых программ
которые лучше работают чем программы на других промышленных языках
A64m
Когда уже люди будут учить хаскель из-за скорости, а не из желания "прочистить мозги"
никогда не понимал прочищальщиков мозгов. я хаскель выучил ради удобств
Евгений
После ML'я-то, конечно, хаскель удобный
Yura
Друзья, есть необходимость ограничить параллелизм. Например, мы слушаем на tcp сокете в accept, на каждый connect делаем forkIO, но хочется ограничить возможность спавнить нити. Причём лучше без каналов.
Aleksei (astynax)
ref со счётчиком?
Cheese
-N спасёт?
Aleksei (astynax)
Я так понимаю, что нужен некий пул
Cheese
или нужна критическая секция?
Yura
пулы насколько я понимаю сделаны на каналах
Yura
forkIO на каждый connect работает норм даже на высоких нагрузуках, но тут соединение прибивается по таймауту, если клиент не прибил
Yura
я вот думаю https://lwn.net/Articles/542629/ REUSEPORT использовать или что-то самому накрутить
Yura
ref со счётчиком?
это что-то вроде семафора получится?
Leonid 🦇
@drcha0s http://hackage.haskell.org/package/async-pool-0.9.0.2/docs/Control-Concurrent-Async-Pool.html
Yura
Page not found
Yura
:)
Yura
но я поня
Leonid 🦇
починил
Vladimir
посмотрите на rate-limit или ему подобные на hackage а reuseport это больше для балансировки нагрузки, зачем здесь - непонятно
Yura
посмотрите на rate-limit или ему подобные на hackage а reuseport это больше для балансировки нагрузки, зачем здесь - непонятно
ну тогда я просто делаю в памяти N нитей и каждая биндит свой сокет и на кадждый connect не надо нить spaw-нить
Leonid 🦇
forkIO же дешевый совсем совсем. Или тебя смущают другие ресурсы?
Leonid 🦇
сразу после форка пусть тред ждёт на семафоре и всё. Правда я не уверен что хаскельный семафор будит треды в том порядке в котором они в вейт встали
Leonid 🦇
т.е. будут некоторые треды которые хоть и встали в вейт раньше но получат тикет позже
Vladimir
тут пул воркеров напрашивается, если форк для вас такой дорогой
Leonid 🦇
Ааа, лол
Leonid 🦇
Так там слишком много в TIMED_WAIT остаётся? Или нужно просто limit поднять?
Yura
recurcive DNS он уже работает для UDP, сейчас туда добавляется TCP и TLS
Yura
так вот сразу закрывать TCP и TLS не получается и надо ждать десятки секунд если клиент не закрыл соединение
Yura
в QSem
Спасибо
Andrew
Фух. В чате про кресты пропагандировал Haskell как мог 😅