Aleksei (astynax)
PlantUML
kalloc
http://plantuml.com/latex ?
Alexander
plantuml и можно сразу в картинки
kalloc
ну желательно все же хранить в сорцах + Makefile
Alexander
у него же текстовый файлик на входе
Alexander
если я не путаю с другим
A64m
да
Антон
A64m
да обычно никак не обходят, оно того не стоит
Cheese
Anatolii
{-# OPTIONS_GHC -F -pgmF autoexporter -optF --deep #-}
А что происходит когда я вот такое в модуль вписываю?
Компилятор в этом месте вызывает executable просто?
Denis
да
Anatolii
Спасиб
Denis
во время компиляции используется плагин autoexplorer
Anatolii
Да я в его доках и нашел этт
Anatolii
Просто стало интересно что там внутрях происходит
Anatolii
-F -pgmF это флаги для компилятора?
A64m
Антон
Народ, есть такой код:
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 в случае вектора
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тоит ли"
Антон
Антон
Aleksei (astynax)
Вот только это не комбинаторы для функций, это комбинаторы для стрелок, а то что они с функциями работают - частный случай. Но из-за фанатизма вокруг бесточечной записи этими операторами злоупотребляют в т.ч. и новички, что, ИМХО, не идёт на пользу пониманию и формирует неправильные привычки
Cheese
Антон
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
Антон
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), так и пишешь