Dmitry
снизу
фильтр я знаю, не знал что он комбинатор
Cat
фильтр я знаю, не знал что он комбинатор
Можно докинуть сверху ещё один фильтр
Cat
А потом ещё
Je
каких других? там нет чисел
у тебя какой-то заоблачный уровень познания функциональщины и комбинаторов, я дальше не берусь продолжать диалог, чисел нет, но вы держитесь
Dmitry
переменная, которая не является аргументом функции
а локальные переменные для это чистой функции тоже являются свободными или только захваченные (внешние)переменые (хотя это уже не чистая функция получается)?
Dmitry
а в чем смысл их отсуствия?
Миша
а в чем смысл их присутсвия?
Dmitry
не понимаю разницы между a = x*2; return a и return x*2, где x аргумент функции
Dmitry
какая разница как реализована чистая функция если она действительно чистая ?
Миша
не понимаю разницы между a = x*2; return a и return x*2, где x аргумент функции
разницы нет, ты просто переименовал выражение
Dmitry
разве a - это не свободная переменная ? я чего то недопонимаю
Миша
a => (b => a * b) -- первая функция не имеет свободных переменных, а вторая имеет -- a
Je
не понимаю разницы между a = x*2; return a и return x*2, где x аргумент функции
разница только в том, что в хаскеле первый вариант будет трудно записать, через do-notation, поскольку нет никаких "переменных" в истинном понимании этого слова как имени, за которым закреплена ячейка с изменяемым данными
Aliaksandr
ничего не понятно. В этом весь смысл функциональщины - запутать простую задачу до такой степени, что ее не решить без трех высших по матану
Je
как раз функциональщина-то понятна, максимально декларавтивна и незапутанна, поэтому часто используется для написания лексеров-парсеров и прочей подобной вычислительной вещи
Aliaksandr
вот классический пример подсчета факториала с помощью комбинаторов: Consider the factorial function F(n) recursively defined by F(n) = 1, if n = 0; else n × F(n − 1). In the lambda expression which is to represent this function, a parameter (typically the first one) will be assumed to receive the lambda expression itself as its value, so that calling it – applying it to an argument – will amount to recursion. Thus to achieve recursion, the intended-as-self-referencing argument (called r here) must always be passed to itself within the function body, at a call point: G := λr. λn.(1, if n = 0; else n × (r r (n−1))) with  r r x = F x = G r x  to hold, so  r = G  and F := G G = (λx.x x) G The self-application achieves replication here, passing the function's lambda expression on to the next invocation as an argument value, making it available to be referenced and called there. This solves it but requires re-writing each recursive call as self-application. We would like to have a generic solution, without a need for any re-writes: G := λr. λn.(1, if n = 0; else n × (r (n−1))) with  r x = F x = G r x  to hold, so  r = G r =: FIX G  and F := FIX G  where  FIX g := (r where r = g r) = g (FIX g) so that  FIX G = G (FIX G) = (λn.(1, if n = 0; else n × ((FIX G) (n−1)))) Given a lambda term with first argument representing recursive call (e.g. G here), the fixed-point combinator FIX will return a self-replicating lambda expression representing the recursive function (here, F). The function does not need to be explicitly passed to itself at any point, for the self-replication is arranged in advance, when it is created, to be done each time it is called. Thus the original lambda expression (FIX G) is re-created inside itself, at call-point, achieving self-reference. In fact, there are many possible definitions for this FIX operator, the simplest of them being: Y := λg.(λx.g (x x)) (λx.g (x x)) In the lambda calculus, Y g  is a fixed-point of g, as it expands to: Y g (λh.(λx.h (x x)) (λx.h (x x))) g (λx.g (x x)) (λx.g (x x)) g ((λx.g (x x)) (λx.g (x x))) g (Y g) Now, to perform our recursive call to the factorial function, we would simply call (Y G) n, where n is the number we are calculating the factorial of.
Je
fixed-point да, я ждал этого!)
Je
только это запись в альфа, не в комбинаторах, в комбинаторах SKI же
Dmitry
a => (b => a * b) -- первая функция не имеет свободных переменных, а вторая имеет -- a
я нашел определение что свободная переменная - это переменные, которые не объявлены локально и не передаются в качестве параметра
Aliaksandr
Aliaksandr
функциональное программирование - оно такое - у каждого свое представление о базовых понятиях :) Наверное, потому что они элементарны и просты в понимании
Je
а че это такое ?
это когда при рекурсивном вызове и return в конце функции не происходит погружение в стек, а результат накапливается в некотором аккумуляторе
Aliaksandr
а в го уже есть оптимизация хвостовой рекурсии?
нет и надеюсь не будет. Хотя баг есть https://github.com/golang/go/issues/22624
Aliaksandr
т.к. если сделают оптимизацию хвостовой рекурсии, в го набегут функциональщики и загадят код переписыванием циклов на хвостовую рекурсию
Je
нет и надеюсь не будет. Хотя баг есть https://github.com/golang/go/issues/22624
так это странно, как тогда работает этот парсер? медленно и пожирая ресурсы? здесь вот точно это бы пригодилось https://github.com/golang/go/blob/master/src/cmd/compile/internal/syntax/parser.go#L673
.
Такой вопрос. Если бы перед вами стояла задача написать API для высокорагруженного сервиса, похожего на социальную сеть (группы, сообщения, посты, все вот это), вы бы все равно использовали Го или что то другое?
Aliaksandr
интересно, почему?
наверное, потому что парсер проще написать на императивщине
Cat
наверное, потому что парсер проще написать на императивщине
а я думал из-за того, что в го нет комбинаторов вот незадача
Миша
не вижу альтернативы go
а какими альтернативами владеете?
Aliaksandr
а я думал из-за того, что в го нет комбинаторов вот незадача
у разработчиков го есть свои генерики для map, slice и chan, которые они не дают обычным пользователям. Поэтому при желании они могли бы сделать для себя комбинаторы. Но почему-то не сделали.
Je
Скажем, по ресурсам ограничений нет. От 15-20к запросов в секунду
это не сильно много, я бы думал не за го, а какую базу взять и как шердить, скейлить, как обеспечить стейтлесс-приложение, здесь даже не суть го это или не го, можно на питоне (но не нужно)
Dmitry
https://www.techempower.com/benchmarks/
3 место на яве. неожидано
Je
3 место на яве. неожидано
ващет первое, ты смотри табличку Multiple queries
Aliaksandr
а какими альтернативами владеете?
- всякие python, ruby, php не подойдут по скорости - C, rust, C++, asm не подойдут по сложности написания кода - java, c# не подойдут из-за любителей многослойных абстракций и паттернов проектирования - node.js не подойдет, т.к. это верх дебилизма. - остальные нишевые языки не подойдут, т.к. потом не найдете программистов на поддержку проекта
Dmitry
ващет первое, ты смотри табличку Multiple queries
стоп. а зачем тогда нам голанг для микросервисов ?
Dmitry
меня заманили обманом в эту секту !
Aliaksandr
> так это странно, как тогда работает этот парсер? медленно и пожирая ресурсы? наверное, поэтому программы на го компилируются в 100 раз быстрее, чем расово верный компилятор на rust c комбинаторами и лямдами
Aliaksandr
то есть никакими не владете
почему же? го немного знаю
Je
стоп. а зачем тогда нам голанг для микросервисов ?
тем, что в го есть все для написания микросервисов, и низкий порог вхождения, что вместе с неплохой производительностью дают профит бизнесу
.
А к Erlang как относитесь?
Aliaksandr
https://www.techempower.com/benchmarks/
вот последние результаты https://www.techempower.com/benchmarks/#section=test&runid=2c113b42-5dbb-4eea-a0b9-b4d6863f5cad . Они перешли на серваки от микрософта и все ускорилось.
Aliaksandr
А к Erlang как относитесь?
не знаком с ним. Но после вот таких топиков https://dou.ua/forums/topic/23644/ складывается не очень хорошее впечатление
Dmitry
тем, что в го есть все для написания микросервисов, и низкий порог вхождения, что вместе с неплохой производительностью дают профит бизнесу
а чем он низкий порог вхождения то ? чето взял яву - там простое родное ооп с наследованием, взял го - а там утиная типизация и ооп через композицию
Dmitry
о, у меня сейчас кейс называется "перевод с го на Х"
э хорош пугать меня, а то я счас разочаруюсь в го и уйду в яву
Aliaksandr
о, у меня сейчас кейс называется "перевод с го на Х"
го ниасилили? на что переходите? на раст?
Je
а чем он низкий порог вхождения то ? чето взял яву - там простое родное ооп с наследованием, взял го - а там утиная типизация и ооп через композицию
Не знаю, когда я пытался поставить стек явы для разработки: спринг, акка, гибернейт и зависимости, у меня как-то подгорало. Ты дальше хелловорда яву пробовал?
Cat
го ниасилили? на что переходите? на раст?
Осилили, осилили, вы так за нас не переживайте
Aliaksandr
Je
ну тогда тебе дорога в яву, только и всего, ничего плохого в этом нет
Dmitry
хотя нет. лучше в c# уйду, там net.core призывно рукой машет
Dmitry
ну тогда тебе дорога в яву, только и всего, ничего плохого в этом нет
не, может это все таки ошибка? у го 2х разница с явой?
Aliaksandr
растер с пятилетним опытом ? :)
он автор раста? работал в мазилле?
Je
не, может это все таки ошибка? у го 2х разница с явой?
а что тебя удивляет? jvm пилят не первый десяток лет, определенно она во многих синтетических тестах выигрывает, даже порой у реализации на с++
Dmitry
вот последние результаты https://www.techempower.com/benchmarks/#section=test&runid=2c113b42-5dbb-4eea-a0b9-b4d6863f5cad . Они перешли на серваки от микрософта и все ускорилось.