Aleksei (astynax)
PlantUML
kalloc
http://plantuml.com/latex ?
Alexander
plantuml и можно сразу в картинки
kalloc
ну желательно все же хранить в сорцах + Makefile
Alexander
у него же текстовый файлик на входе
Alexander
если я не путаю с другим
A64m
да
Антон
да. Tuple2 a b, Tuple3 a b c и так далее
Кстати, а как в Хаскеле обходят непараметризованность кортежей по длине? Юзают TH?
A64m
да обычно никак не обходят, оно того не стоит
Denis
А в чём "так себе" выражается?
Сомнительные решения по части интерфейсов и крайне opinionated
Anatolii
{-# OPTIONS_GHC -F -pgmF autoexporter -optF --deep #-} А что происходит когда я вот такое в модуль вписываю? Компилятор в этом месте вызывает executable просто?
Denis
да
Anatolii
Спасиб
Denis
во время компиляции используется плагин autoexplorer
Anatolii
Да я в его доках и нашел этт
Anatolii
Просто стало интересно что там внутрях происходит
Anatolii
-F -pgmF это флаги для компилятора?
A64m
https://hackage.haskell.org/package/tuple
отличный пример как не обходят
Антон
Народ, есть такой код: shift = go where go [] = [] go (x:xs) = xs ++ [x] Как выглядит эквивалентный код для вектора?
Антон
Пробовал так: shift' = uncurry (flip V.snoc) . (&&&) V.head id . V.splitAt 1 , но так не компилится
Антон
Окей, перестал задрачивать на point-free и переписал в виде shift' x = V.snoc (V.tail x) (V.head x)
Aleksei (astynax)
(++) . tail <*> (:[]) . head
Aleksei (astynax)
> (++) . tail <*> (:[]) . head $ "123" "231"
Aleksei (astynax)
V.snoc . V.tail <*> V.head в случае вектора
Антон
V.snoc . V.tail <*> V.head в случае вектора
/me пытается осознать смысл <*> применительно к вектору
Cheese
не к вектору
Антон
А к чему?
Aleksei (astynax)
это инстанс аппликатива для функции
Зигохистоморфный
к функции
Aleksei (astynax)
f <*> g = \x -> f x (g x)
Cheese
V.head — функция
Антон
Ну ок. В аппликативах я всё ещё плаваю
Зигохистоморфный
можешь и liftA2 V.snoc V.tail V.head
Cheese
не мучайте человека аппликативами
Aleksei (astynax)
это же отличный повод посмотреть и разобраться!
Cheese
тем более, такими
Aleksei (astynax)
Тогда м.б. не стоит и в pointfree глубоко лезть и обмазываться стрелочными *** да &&&, пока плаваешь в аппликативах :)
Зигохистоморфный
ага
Leonid 🦇
Нет.
Aleksei (astynax)
"С pointfree всё лучше" ?
Leonid 🦇
Вот вы это написали, и в ту же секунду с канала человек вышел
Leonid 🦇
Я видел как тикнул каунтер
Aleksei (astynax)
"Если в pointfree появились flip и uncurry, то чтоит задуматься, cтоит ли"
Антон
Тогда м.б. не стоит и в pointfree глубоко лезть и обмазываться стрелочными *** да &&&, пока плаваешь в аппликативах :)
Ну, применительно к функциям у (***) и (&&&) смысл достаточно прозрачный, ИМХО
Aleksei (astynax)
Вот только это не комбинаторы для функций, это комбинаторы для стрелок, а то что они с функциями работают - частный случай. Но из-за фанатизма вокруг бесточечной записи этими операторами злоупотребляют в т.ч. и новички, что, ИМХО, не идёт на пользу пониманию и формирует неправильные привычки
Зигохистоморфный
Не хочу юзать секции композиции
http://fprog.ru/2010/issue4/denis-moskvin-compositions-sections/
Антон
http://fprog.ru/2010/issue4/denis-moskvin-compositions-sections/
Читал. Всё равно не хочу
Arthur
Окей, перестал задрачивать на point-free и переписал в виде shift' x = V.snoc (V.tail x) (V.head x)
Если так уж сильно нравится point-free style, но результат не компилится, сконвертировать выражение можно здесь http://pointfree.io/ . Но, как по мне, это сильно ухудшает читабельность кода.
Alexander
код не нужен
Alexander
он врет
Aleksei (astynax)
Ну разок то можно - я про (f . ) . g. Вот когда много раз сечёшь композицию, то уже сложновато читать становится. Только для code golf сгодится
Alexander
там баги
Alexander
достаточно только типов
Alexander
написал и можно идти пить чай
Alexander
чай важно
Alexander
код нет
Alexander
извините
Aleksei (astynax)
чай - важно!
Антон
solution = curry $ (/2) . abs . sum . uncurry (zipWith (*)) . (***) shiftedSum shiftedFSub ^Это считается за point-free abuse?
Aleksei (astynax)
Это норм
Aleksei (astynax)
на самом деле нет :)
Антон
на самом деле нет :)
Хорошо, а как бы вы написали? Я ненастоящий штангист, я только учусь
Aleksei (astynax)
Написал бы с аргументами
Aleksei (astynax)
solution xs ys = (/2) . abs . sum $ zipWith (*) xs ys
Антон
solution xs ys = (/2) . abs . sum $ zipWith (*) xs ys
ну, это малость не то
A64m
((/2) . abs . sum . zipWith (*)) <$> shiftedSum <*> shiftedFSub
A64m
(не проверял в ghci)
Антон
Aleksei (astynax)
Вот да, instance Applicative ((->) a) и тут полезен
A64m
они может и не нужны
Aleksei (astynax)
Можно без скобок вокруг первой композиции, т.к. у (.) приоритет выше, чем у (<$>)
Aleksei (astynax)
только будет таки сечение композиции, кмк (((/2) . abs . sum) .) . zipWith (*) т.к. левая часть данного аппликативного выражения должна принять два аргумента
sherzod
Подскажите, вот здесь https://wiki.haskell.org/Typeclassopedia Exercises Implement Functor instances for Either e and ((->) e). Под Either e имеется в виду взять для e конкретный тип? Например Either Int?
Vladislav
Нет
Vladislav
instance Functor (Either e), так и пишешь