Aliester
как минимум состояние самого погромиста
A64m
не противоречит функциональности - с элементами ФП же. Речь про то, что основной инструментарий для организации кода там ООП
Andrei
чистые функции невозможны в принципе
да, поэтому нечего и пытаться
Aliester
жабий скрип вот вообще side-effect driven
Alexander
функции есть, тайпклассы есть, cats есть
Функциональным язык становится, когда форсит функциональный стиль и облегчает композицию функций.
Ignat
ну на скале вполне себе пишут функционально
Ignat
видимо, это не "форсит", но и не препятствует
Alexander
Я на С++ пишу функционально. В нем ФП-фишек не сильно меньше. Это не делает его ФЯ
Ignat
ну кресты всё же скорее препятствуют
Alexander
Даже больше, я могу имитировать хаскельный оператор композиции (.) с почти таким же синтаксисом. Это все равно ничего не значит
Alexander
Эрланг тоже не ФЯ, кстати
A64m
так то понятно что с альтернативной базовой библиотекой, прилежанием и усидчивостью можно писать как на эмеле, но это, я так понимаю, в скале не мейнстрим, а отдельное направление в котором всякие эмелисты и хаскелисты, вынужденные писать для жвм мучаются.
sherzod
мне кажется дело не в форсинге (что за тоталитаризм) а в удобстве написания функциональных конструкций
Ignat
ну многие пользуются cats
Ignat
или на худой конец scalaz
sherzod
в С++ (это мой основной язык в опыте) крайне неудобно, на грани невозможного писать функционально
Alexander
Неудобно - да. Возможно - да. Сложно - не сложнее, чем прочий плюсовый код.
sherzod
а так, да в с++ даже завтипы есть (всю жизнь пользовался и не знал что это они)
Ignat
ну вот разница в том, что на скале удобно
Ignat
зависимые от constexpr
Ignat
ну такое
sherzod
ну вот разница в том, что на скале удобно
ну вот. есть и очень неудобные моменты, каррирование конструкторов типов например
Ignat
ну в дотти вроде собираются с этим что-то сделать
sherzod
А расскажите поподробнее, плиз
ну что-то вроде scope<2>::type scope❤️>::type
sherzod
лол
A64m
ну вот разница в том, что на скале удобно
удобнее чем на плюсах, конечно, но, думаю, не особо удобно. Ни вывода типов, ни легковесного синтаксиса, ни базовых удобств типа сравнений нормальных, ни оптимизаций для ФП кода
Ignat
ну tail-recursive calls обещают оптимизировать))
Ignat
синтаксис — сугубо вкусовщина
Timmy B
> Ни вывода типов, http://en.cppreference.com/w/cpp/language/auto частично, но есть
Ignat
лол
A64m
да нет, синтаксис либо делает что-то простым (объявление и использование каррированных функций, алгебраических типов, ПМ) либо всякие штрафующие навороты на это все наворачивает, чтоб программист особо не разгулялся
Ignat
тоже справедливо
Oleg
А поясните, мы сейчас поносим скалку или плюсы?
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
всё поносим же
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
//скоро окажется что хаскель не фп язык
Alexander
А поясните, мы сейчас поносим скалку или плюсы?
Я не рассматриваю эту беседу в через коричневые очки. Есть же объективные факты, которые не надо воспринимать религиозно.
Aliester
хаскель - процедурка
Ignat
а чем всё-таки ценна уникальность инстансов?
Влод
вообще компиляторы с прицелом на перфоманс - не фп
Oleg
а чем всё-таки ценна уникальность инстансов?
Спроси у Одерски https://github.com/lampepfl/dotty/issues/2047
Aliester
вообще компиляторы с прицелом на перфоманс - не фп
все что можно реализовать на современной архитектуре - не фп
Aliester
все равно внутри процедурка
A64m
А поясните, мы сейчас поносим скалку или плюсы?
я плюсы особо не ругаю, это бесполезно, там безнадежно все
Aliester
вот лисп машины были фп
Ignat
всё, что может написать императивный человеческий мозг — не фп
Denis
что значит императивный мозг?
Oleg
всё, что может написать императивный человеческий мозг — не фп
Человеческий мозг не императивен, убеждён в этом
Aliester
нужно создать синтетических функциональных людей
Oleg
нужно создать синтетических функциональных людей
Но т.к. создавать их будут естественные люди, они всё равно получатся....
Oleg
Нужен какой-то аккуратный бутстрэп
Aliester
фак
Aliester
транзитивность
Aliester
как бороться с транзитивностью?
Oleg
а чем всё-таки ценна уникальность инстансов?
На самом деле хрестоматийным ответом должно служить https://www.youtube.com/watch?v=hIZxTQP1ifo
Ignat
от души...
Oleg
tldw Вадлер - Йода, Одерски - Палпатин, делай свои выводы
Denis
отличный доклад
A64m
сделали бы легкий синтаксис для каста функций к типу с обертками и обратно, чтоб визуально выглядел как выбор инстанса в тех языках, где он есть
A64m
вроде такого (!@@) :: (Coercible a' a, Coercible b' b, Coercible c' c) => (a' -> b' -> c') -> (a -> a') -> a -> b -> c (!@@) f _ = coerce f (!@) :: (Coercible a' a, Coercible b' b) => (a' -> b') -> (a -> a') -> a -> b (!@) f _ = coerce f ex9' = (sort !@ map Down) [1..10::Int] :: [Int] -- [10,9,8,7,6,5,4,3,2,1] ex10 = (F.fold !@ map Sum) [1..10::Int] :: Int -- 55 ex1 = foldl1 ((<>) !@@ First) [Nothing, Just 2, Just 42] -- Just 2 ex2 = foldl1 ((<>) !@@ Last) [Nothing, Just 2, Just 42] -- Just 42 ex2' = foldl1 ((<>) !@@ (Dual . Last)) [Nothing, Just 2, Just 42] -- Just 2 ex3 = (foldl1 ((<>) !@@ Endo) . map const $ [1..6]) 42 -- 1 ex4 = foldl1 ((<>) !@@ All) [True, False, True] -- False ex5 = foldl1 ((<>) !@@ Any) [True, False, True] -- True ex6 = sortBy (compare !@@ Down) [1..5] -- [5,4,3,2,1] ex7 = foldl1 ((<>) !@@ Sum) [1..6] -- 21 ex8 = foldl1 ((<>) !@@ Product) [1..6] -- 720 только с автоматизацией что вот этот вот !@ работал для всего хотя может такое тайпсемейство накостылить можно и без расширения
Denis
напоминает ala у макбрайда
A64m
ala требует инстансов, специальный вид функции к которой применяется ala
Зигохистоморфный
newtype-generic вроде примерно так работает
A64m
т.е. foldMap какой-нибудь, который и та предназначен чтоб в него конструктор обертки пихать
Зигохистоморфный
вот для примера fmap f = over Cofree $ ana (first f . unpack)
A64m
а тут бы надо было так: 1) берем функцию ( к примеру sort), конструктор обертки (к примеру Down) и применяем конструктор обертки к типу функции сорт где он подходит. 2) коэрсим функцию к этому типу и выбираем таким образом нужный словарик 3) коэрсим функцию обратно, чтоб она применялась к необернутому
A64m
по функциональности это будет примерно как выбор инстансов где он есть, но полностью безопасно ну, не опаснее любого другого применения коэрса
A64m
тут конечно не все так однозначно в смысле где подходит
кана
@hotkosc я там тебе крупный пр сделал) Стек, тесты, разнесение по модулям, рефакторинг небольшой https://github.com/kosc/sqrteq/pull/1
Aliester
Жс банальный
andrei
Там есть пайплайн оператор для композиции
A64m
Жс функциональный?
вообще не язык, а скрипт же
andrei
Лол