
Anton
27.12.2016
11:08:11
философский вопрос
стоит сначала понять, что значит ФП вообще
лямбды есть - становится ли язык от этого функциональным?
first-level functions есть - достаточно?

Google

Nikita
27.12.2016
11:09:48
частичное применение надо же
карринг

Sergey
27.12.2016
11:10:15
карринг можно сделать экстеншенами
система типов еще ж нужна другая вроде?

Anton
27.12.2016
11:10:39

Богдан
27.12.2016
11:10:51
тко?

Nikita
27.12.2016
11:10:52
ну вон тайпалиасы завезти обещают

Богдан
27.12.2016
11:11:03
без нее уж точно далеко не уедешь

Anton
27.12.2016
11:11:16
ленивость - Венкат как то вещал что это чуть ли не самый важный компонент

Oleksandr
27.12.2016
11:11:29
лень скорее антипаттерн

Sergey
27.12.2016
11:11:38
лень в смысле как концепт в языке)

Oleksandr
27.12.2016
11:11:43
нет HKT
нельзя делать тайпклассы

Google

Oleksandr
27.12.2016
11:12:17
нет макросов

Nikita
27.12.2016
11:12:19
идрис не ленивый
но чистый фп

Anton
27.12.2016
11:12:46
Вот ещё такое: “Purely functional data structures are persistent. “

Oleksandr
27.12.2016
11:13:01
нет контроля эффектов (следствие отсутствия HKT)

Sergey
27.12.2016
11:13:18
НКТ?

Oleksandr
27.12.2016
11:13:33
типы высших порядков
иногда -- весьма практичная штука

Sergey
27.12.2016
11:21:46
https://twitter.github.io/scala_school/advanced-types.html#higher по примерам не могу понять чем оно отличается от генериков?

Oleksandr
27.12.2016
11:23:41
это дженерик, где констуктором типа есть другой тип
например, List сам по себе бесполезен
он работает с каким-то типом, и последний выступает констуктром для листа
и вот штуки типа F<T<K, V>> и обзываются типами высших порядков

Sergey
27.12.2016
11:26:42
как-то все сложно)

Oleksandr
27.12.2016
11:27:03
это непривычно, но несложно)

Руслан
27.12.2016
11:30:14
Это все не нужно для функционального языка

Oleksandr
27.12.2016
11:32:34
define "fp l"

Sergey
27.12.2016
11:32:49
в чем вообще профит от функциональных подходов в привычных языках?

Oleksandr
27.12.2016
11:33:00

Руслан
27.12.2016
11:33:04
define "fp l"
ну вот, правильный вопрос задал, вместо того чтобы говорить что обязательно должно быть)

Google

Руслан
27.12.2016
11:35:08
Например erlang вообще со сторогой, но динамической типизаций :)
И че, он теперь не fpl?

Anton
27.12.2016
11:39:54
тестировать удобно - да. но дебажить...

Sergey
27.12.2016
11:42:37
проще, и писать, и дебажить
в чем они вообще выражаются? вот сколько читал книженций типа "fp in javascript", "fp in java", "functional thinking" и один хрен непонятно) везде одно и то же глаголят
вот юзайте иммутабельные структуры - не будете знать бед
лямбды, собирайте в композиции, делайте пайплайны
laziness, каррирование и тд
вот например в джаве, заюзаю я стримы, обмажусь лямбдами, возьму какую-нибудь guava для иммутабельных коллекций - я сделаю дофига функционально?

Руслан
27.12.2016
11:44:20
fp в javascript это как секс в резиновой женщиной

Sergey
27.12.2016
11:45:09
вот можешь полистать если хочешь

Руслан
27.12.2016
11:49:28
Лодаш и иммютабле джс конечно норм
Ага, рекурсия и джс
Там большая глубина стека очень сильно бьет по перфу
Не говоря о том что tailrec нету

Anton
27.12.2016
11:59:52
@HeapyHop что за книга?
а, ок

Oleksandr
27.12.2016
13:09:55
в чем они вообще выражаются? вот сколько читал книженций типа "fp in javascript", "fp in java", "functional thinking" и один хрен непонятно) везде одно и то же глаголят
вот юзайте иммутабельные структуры - не будете знать бед
лямбды, собирайте в композиции, делайте пайплайны
laziness, каррирование и тд
вот например в джаве, заюзаю я стримы, обмажусь лямбдами, возьму какую-нибудь guava для иммутабельных коллекций - я сделаю дофига функционально?
ядро ФП -- минимум побочных эффектов
как следствие, область допустимых действий метода значительно сужается, и достаточно лишь сигнатуры, чтобы понять, о чем он
что, по случайному совпадению, также является и признаком "хорошого кода"
лямбды и все такое -- просто приятный довесок к этому ядру, но они вторичны
с такой точки зрения, в ФП стиле можно писать хоть на коболе

Anton
27.12.2016
13:13:57

Oleksandr
27.12.2016
13:14:16
но есть разные техники, которые упорядочивают частовозникаемые паттерны, HKT -- из них

Google

Oleksandr
27.12.2016
13:14:44
например, перевернуть список и отсортировать
где-то здесь вписываются зависимые типы

Anton
27.12.2016
13:15:38
ну вот мне кажется что сигнатуры в общем случае недостаточно. разные методы могут брать один тип, и его же возвращать. трансофрмации всякие

Oleksandr
27.12.2016
13:16:59

Anton
27.12.2016
13:17:33
согласен

Oleksandr
27.12.2016
13:20:35
плюс разные техники автоматически добавляют "защиту от дурака"
можно добиться того же тонной юнит-тестов, а можно умнее написать метод
вот есть тьма градаций, что такое "умнее" -- от, скажем, перехода на статически типизированный ЯП до обмазывания всего скалаз/шейплесом

Sergey
27.12.2016
13:21:04
я если фп код должен упрощать чтение и понимание, почему я не могу с первого раза разобраться что происходит в скала коде?)
а кложа вообще с ума свести любого может
для сравнения если взять питон или руби - читается легко, хотя на них особо ничего не писал. или тот же си

Oleksandr
27.12.2016
13:21:45
непривычка
не начинай с скалаз

Anton
27.12.2016
13:24:15
я заметил, что любой код в ФП стиле сначала трудно даётся просто потому, что он как правило очень “конденсированый”. Сидишь, и думаешь, что же он делает. В отличае от языков типа go, где просто надо прочитать, и вроде бы сразу понятно, если сможешь полотно кода в голове удержать.

Sergey
27.12.2016
13:25:50
(+ 1 2 3) ну так себе читаемость

Nikita
27.12.2016
13:30:12
(print “Hello World”) аааааа сложна

Anton
27.12.2016
13:30:27
ну представь, что нет скобочек. Получается + 1 2 3
Далее, представь что + - это “plus”
ну и получам вызов функции с переменным количеством параметров
как если бы в Java было plus(1,2,3)
но без лишних скобочек и запятых
всё нормально читается :)

Nikita
27.12.2016
13:31:23
к синтаксису многих языков надо привыкать, у меня немного горит, когда говорят, что у лиспов сложный синтаксис (он бы еще был ага)

Google

Sergey
27.12.2016
13:32:27
(let [people (repeatedly 5 lvar)
magazines (repeatedly 5 lvar)
cheeses (repeatedly 5 lvar)
reservations (repeatedly 5 lvar)
answers (map list people magazines cheeses reservations)]
(run 1 [q]
(== q answers)
(== people [:amaya :bailey :jamari :jason :landon])
(permuteo magazines [:fortune :time :cosmopolitan :us-weekly :vogue])
(permuteo cheeses [:asiago :blue-cheese :mascarpone :mozzarella :muenster])
(permuteo reservations [5 6 7 7.5 8.5])))
я вот только догадываться могу что тут реально происходит

Nikita
27.12.2016
13:33:07
после let в квадратных скобках создаются “локальные переменные”
типа как val people = repeatedly(5, lvar)
слева всегда ф-я, справа всегда аргументы

Sergey
27.12.2016
13:34:16
да расшифровывать мне не нужно) просто говорю что такое читается в разы хуже чем какой-нибудь го

Nikita
27.12.2016
13:35:08
вот реально по-моему дело привычки просто)
по мне так го какой-то кривой в плане синтаксиса
вот я его не знаю, смотрю и не совсем понятно (совсем непонятно) чего там происходит например

Sergey
27.12.2016
13:37:47
https://github.com/ognick/wizards-of-portal/blob/master/core/src/main/scala/wop/game/ai/WopSolver.scala вот это считается чистым функциональным подходом ведь?
код Фомкина если че

Anton
27.12.2016
13:38:40
да чёт от обычной Java особо не отличается. но я не спец, если чо :)
вот это больше на настоящий ФП похоже :) https://gist.github.com/viktorklang/9414163

Sergey
27.12.2016
13:42:46
хм, а в котлине нельзя ж написать x when {...}? только when(x){...}?
https://blog.jetbrains.com/kotlin/2016/12/kotlin-1-0-6-is-here/
погнали all-open костыли)

Anton
27.12.2016
17:54:53

Sergey
27.12.2016
17:55:48
немного странные решения