Aliester
как минимум состояние самого погромиста
A64m
не противоречит функциональности - с элементами ФП же. Речь про то, что основной инструментарий для организации кода там ООП
Andrei
Aliester
жабий скрип вот вообще side-effect driven
Ignat
ну на скале вполне себе пишут функционально
Ignat
видимо, это не "форсит", но и не препятствует
Alexander
Я на С++ пишу функционально. В нем ФП-фишек не сильно меньше. Это не делает его ФЯ
Ignat
ну кресты всё же скорее препятствуют
Alexander
Даже больше, я могу имитировать хаскельный оператор композиции (.) с почти таким же синтаксисом. Это все равно ничего не значит
Alexander
Эрланг тоже не ФЯ, кстати
A64m
так то понятно что с альтернативной базовой библиотекой, прилежанием и усидчивостью можно писать как на эмеле, но это, я так понимаю, в скале не мейнстрим, а отдельное направление в котором всякие эмелисты и хаскелисты, вынужденные писать для жвм мучаются.
sherzod
мне кажется дело не в форсинге (что за тоталитаризм)
а в удобстве написания функциональных конструкций
Ignat
ну многие пользуются cats
Ignat
или на худой конец scalaz
Alexander
sherzod
в С++ (это мой основной язык в опыте) крайне неудобно, на грани невозможного писать функционально
Alexander
Неудобно - да. Возможно - да. Сложно - не сложнее, чем прочий плюсовый код.
sherzod
а так, да в с++ даже завтипы есть (всю жизнь пользовался и не знал что это они)
Ignat
ну вот разница в том, что на скале удобно
Ignat
зависимые от constexpr
Ignat
ну такое
Alexander
Ignat
ну в дотти вроде собираются с этим что-то сделать
sherzod
лол
A64m
ну вот разница в том, что на скале удобно
удобнее чем на плюсах, конечно, но, думаю, не особо удобно.
Ни вывода типов,
ни легковесного синтаксиса,
ни базовых удобств типа сравнений нормальных,
ни оптимизаций для ФП кода
Ignat
ну tail-recursive calls обещают оптимизировать))
Ignat
синтаксис — сугубо вкусовщина
Timmy B
> Ни вывода типов,
http://en.cppreference.com/w/cpp/language/auto частично, но есть
Ignat
лол
A64m
да нет, синтаксис либо делает что-то простым (объявление и использование каррированных функций, алгебраических типов, ПМ) либо всякие штрафующие навороты на это все наворачивает, чтоб программист особо не разгулялся
Ignat
тоже справедливо
Oleg
А поясните, мы сейчас поносим скалку или плюсы?
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
всё поносим же
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
//скоро окажется что хаскель не фп язык
Aliester
хаскель - процедурка
Влод
Ignat
а чем всё-таки ценна уникальность инстансов?
Влод
вообще компиляторы с прицелом на перфоманс - не фп
Oleg
Aliester
все равно внутри процедурка
Aliester
вот лисп машины были фп
Ignat
всё, что может написать императивный человеческий мозг — не фп
Denis
что значит императивный мозг?
Oleg
Aliester
нужно создать синтетических функциональных людей
Oleg
Нужен какой-то аккуратный бутстрэп
Aliester
фак
Aliester
транзитивность
Aliester
как бороться с транзитивностью?
Ignat
от души...
Oleg
tldw Вадлер - Йода, Одерски - Палпатин, делай свои выводы
Denis
Denis
отличный доклад
A64m
сделали бы легкий синтаксис для каста функций к типу с обертками и обратно, чтоб визуально выглядел как выбор инстанса в тех языках, где он есть
Oleg
Зигохистоморфный
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
andrei
Aliester
Жс банальный
andrei
Там есть пайплайн оператор для композиции
andrei
Лол