Alexander
почему там Tweag не hiring
Alexander
интересно
Alexander
а фейсбук, по их мнению, в Лондоне, ok
Марлоу то там сидит? судя по тому что HR пишут
Vladislav
но команда какого-нибудь haxl-а почти целиком в Калифорнии, например
Cheese
мы тоже нанимаем. надо исправить табличку
Зигохистоморфный
Кажется мне что тут не оптимальный код на хаскель написали http://akgupta.ca/blog/2014/06/21/k-nn-algorithm-in-golang-and-haskell/
Влод
ну в коментах скинули https://www.reddit.com/r/haskell/comments/27tcvz/knearest_neighbors_in_haskell_is_elegant_but_slow/
Влод
так и не сравнили эти решения против го на одной машине
melvin
хаскель не боится переполнения стека нехвостовой рекурсией благодаря ленивости?
Dmitry
Бояться может только разработчик
Dmitry
Но у него есть профайлер
Зигохистоморфный
https://blogs.msdn.microsoft.com/commandline/2017/02/09/haskell-on-bashwsl/
Влод
https://github.com/tippenein/docs-plox Оставлю эту ссылку здесь, чтобы не забыть посмотреть что там
Зигохистоморфный
у меня только по RS есть примеры) (что пилил пока игрался)
Anonymous
как перевести strong lax monoidal functor на русский язык? http://strictlypositive.org/IdiomLite.pdf
Anonymous
строгий моноидальный функтор - это понятно, а lax что означает, никто не знает русскую терминологию?
xzz
Гугл говорит , что "слабый функтор" ))
Anonymous
строгий слабый функтор, звучит так себе, лол)
Зигохистоморфный
Гуталакс
Anonymous
@xgrommx, кек
Alexander
кто с http-reverse-proxy работал?
Alexander
чего-то оно у меня не хочет web-socket соединение проксировать
Misha
вопрос знатокам, вот есть у меня вот такая штука data ErrorCachingStrategy = NoErrorCaching | TimedCaching NominalDiffTime и есть у меня что-то типа type family IOResult_ v caching type instance IOResult_ v NoErrorCaching_ = Either SomeException v type instance IOResult_ v TimedCaching_ = Either (SomeException, UTCTime) v но чтобы это работало на уровне типов мне городить либо вот такое: data NoErrorCaching_ data TimedCaching_ = TimedCaching_ NominalDiffTime либо что пытаться делать с DataKinds. Можно ли тут что-то придумать, за счет промоушена data values в типы? Нечто вроде (оно не компиируется с DataKinds) type instance IOResult_ v 'NoErrorCaching = Either SomeException v
Misha
ну и вообще, я возможно неверно понимаю использование значений на уровне типов
Misha
а вот, сам допер data ErrorCaching = NoErrorCaching | TimedCaching NominalDiffTime type family IOResult_ v (caching :: ErrorCaching) type instance IOResult_ v NoErrorCaching = Either SomeException v type instance IOResult_ v (TimedCaching _) = Either (SomeException, UTCTime) v
Misha
как этим пользоваться теперь - другой вопрос, но уже лучше
Alexander
можно если тип сделаешь гадтом
Alexander
и в разных конструкторах будет разные тип
melvin
если у нас есть структура (дерево например) и нам необходимо вставить новую ячейку или изменить существующюю, то необходимо перестраивать всю структуру?
Влод
Да
Дима
Ну не факт, что всю
melvin
ну допустим все ноды кроме добавленной кэшируются, а что с производительностью?
Alexander
что значит кешируются?
melvin
что значит кешируются?
память на них вновоь не выделяется
Alexander
если нужно вставить, изменить ячейку, то перестроится часть структуры, от головы до узла (что это именно значит зависит от структуры)
Alexander
выделится
melvin
🤔
Alexander
память выделится в любом случае если ты не руками пишешь в какой-нить MutableByteArray# и работаешь с unboxed объектами
melvin
я сейчас смотрю на тривиальную реализацию и у неё прям все очень плохо с производительность
Alexander
/shrug
Alexander
(хм.. слаковые привычки не работают тут)
Alexander
кешируются = память не выделяется, это какое-то странное определение:/
Alexander
я не умею в таких общаться, надо словарь выстраивать
Alexander
в общем если структура иммутабельная, то нужно перестраивать её часть, в паталогических случаях это дорого
Alexander
память выделяется много и часто, но стоимость этого дешевле, чем скажем в си
Alexander
часть методов могут unbox-ить параметры, тогда выделений как таковых может не быть
Aleksei (astynax)
Это "данные по месту", вместо указателя
Alexander
формально это убирать indirection, когда ты вместо указателя хранишь данные сразу
Alexander
но так тоже подойдет
Alexander
"стек" в модели вычислений в haskell штука тоже особая
Alexander
т.к. он живет в хипе, и обычный стек используется для сишных вызовов
Alexander
т.к. у нас CPS модель
Alexander
(я щас не очень точные термины пишу, но все же)
melvin
а все таки как обходится с большими структурами данных? я слышал хаскель дружит с си...может просто использовать сишные функции для этого?
Alexander
ну у меня не возникало особых проблем с большими структурами данных
Alexander
обычно где нужен хороший memory footprint, все равно на векторах что-то будет
Aleksei (astynax)
Часто скорости помогает просто правильная расстановка бэнгов :)
Aleksei (astynax)
И вообще Окасаки вон книжку даже написал про структурки, там есть и про скорость
Alexander
вот да, без них легко дров наломать снепривычки
melvin
очень сложно, укатываюсь читать
Alexander
лучше сначала с языком на ты встать, там тогда попроще будет
Aleksei (astynax)
При этом ленивость же дико помогает эффективности функциональных структур - куча ненужной работы откладывается и частенько не выполняется вообще :)
Alexander
вообще со строгими ephemeral структурками, на сях и т.п. попроще будет,но с ненулевой вероятностью цена FFI может быть дороже цены аккуратного написания структурки в haskell
Aleksei (astynax)
Всякие Finger Trees очень хорошо на ленивость ложатся
Alexander
ну везде где нужно амортизированное время и расшаривать стоимость
Alexander
в общем-то в окасаки ленивость и появляется в той главе, где начинаеются честный подсчет сложностьи если действительно используется персистентность
Alexander
ну это наверное уже оффтоп
Alexander
если нужно что-то и срочно и понять, то возможно проще просто показать какой-то гист и попросить помочь
Alexander
(не идеальный вариант конечно)
Denis
Подскажите, плиз, вот ведь type не может быть частично применён, но не всегда можно (дёшево) сделать newtype для instance-а. Например, делаю небольшой рефакторинг: в одном модуле есть newtype BaseT e w m a = .. { .. ReaderT e (WriterT w m) a }, в другом нечто длинное, типа type Session st m a = BaseT (SessionEnv (SessionState st)) Builder (CGIT m) a, и ещё в третьем: type SomeSession a = Session SomeState IO a. Просто так это всё не поменять - много где тип "гвоздями прибит". Но всё же, необходимо сделать instance SomeClass SomeSession... Я пока придумал уродливый хак - дублирование type-ов: type SessionP st m = BaseT (SessionEnv (SessionState st)) Builder (CGIT m), type SomeSessionP = SessionP SomeState IO и далее instance SomeClass SomeSessionP. Оно работает, но неужто по-иному нельзя?
Alexander
а SomeClass для BaseT написать нельзя чтоли?
Alexander
особенно если BaseT твой
Denis
ну ИМХО оно будет ещё более некрасиво, чем сейчас :)
Alexander
instance SomeClass (BaseT e w m)
Denis
нет, там надо именно от всей "простыни" SomeSession-а делать instance
Denis
и каждый раз всё это писать - несколько ИМХО неправильно (особенно если потом, например, CGIT придётся на что-то менять). Может, я не понял смысл type, но использовал его тут как alias для типов, чтоб каждый раз "простыни" не повторять. Но вообще, это я писал 4 года назад, сейчас оно уже legacy, но некоторую часть из него пере-использовать хотелось бы.
Denis
Притом BaseT и её производные браться как раз не будут, мне приходится с ними возиться, чтоб отделить от них "высокоуровневый" код.