кана
Ilya
а вообще интересно, на какой клаве ты это набирал
кана
Это FiraCode шрифт с лигатурами от Тонского
Alexander
поэтому линзы называют van Laarhoven
Alexander
т.к. Кметт их изобрёл
Ilya
кана
Но вот словесносное описание, писал в одной конфе:
Линза - не пара из геттера и сеттера. Это ТОЛЬКО идентити, который еще запаковывает значение. Но обобщенный, то есть функции применяется к значениям не напрямую, а через функторы (что дает нам возможность внести в этот процесс идентити какой-то эффект, например изменение).
Итак, что делает линза, основанная на геттере и сеттере:
Линза принимает некую функцию pure', которая просто маленькое значение заворачивает в функтор (переносит в эффектфул мир). Далее линза принимает большое значение. С помощью геттера вытаскивает из него маленькое значение, переносит его в функтор через pure'. А потом применяет в эффектфул-мире (fmap) сеттер к объекту.
То есть в прямом смысле вытащили значение и внесли его обратно, но сделали это в внутри функтора.
И вся магия в том, что с помощью разных функторов и pure' можно делать разные вещи. Например, если сама по себе линза - такой идентити модификатор, то если отправить в нее конструктор функтора, который перед этим еще применяет к значению какую-нибудь функцию, то получится over.
А если использовать Const, который позволяет обернуть значение в функтор, но потом не дает ничего с ним сделать через fmap, то на выходе мы получим контейнер с нетронутым маленьким значением внутри. Это view.
Alexander
newOuter newInner это все неправильно
Alexander
т.к. работает не всегда
Alexander
а зачем путать себя?
Влод
Alexander
конечно
Alexander
потому, что а. не путает, б. не приводит ложное описание в. не несёт неверной информации
кана
Тебя ничего не может запутать, если ты ничего не понимаешь, think about it
Влод
неплохо
Alexander
простота входа vs удобство для повседевного программирования?
Alexander
это как с Monad m и т.п.
Alexander
ещё в математику придите переобозначать переменные
Влод
главное чтобы ещё в консольке при компиляции эти аргументы типа не давали ложного представления
Alexander
особенно весело будет когда они будут замагленные
Alexander
и так читать недобно, а там они ещё и длинные будут
Alexander
просто замечательно
Cheese
Кметт же всего лишь реализовал наброски ван Лаарховена?
Alexander
третий человек 😏
Cheese
ваш телеграм читать невозможно, поэтому я только пишу
Cheese
Контроль. Монада. Писатель.
Aleksei (astynax)
"Управление.Монада.Писатель", тогда уж
Alexander
это правильно
Alexander
те кто читают легко могут через mapMaybe прогнать
Alexander
а кто не читает ничего не теряет
Alexander
я думаю из 481 человека большинство не читает
Andrew
Поставил обычный FiraCode
кана
FiraCode это сам по себе обычный) Есть FiraMono
Leonid 🦇
terminus master race
Anonymous
а почему fmap для (,) меняет второй элемент?
Ilya
а сколько он менять должен?
кана
потому что так определен функтор
Functor (,) a
Ilya
типы же разные в (a, b)
Alexander
(a,b) <-> (,) a b
Anonymous
ну а почему не первый например
Alexander
что функтор ещё может делать?
Alexander
потому что Functor (* -> *)
кана
в хаскеле в принципе можно определить функтор только для последнего аргумента (и он обязательно должен быть, потому что интанс мы делаем не для типа, а для конструктора типа, который принимает один (!) тип и отдает другой тип (!)) (но можно использовать всякие
newtype Flip f a b = Flip { unFlip: f b a })
А для двух значений использовать N-функторы, типа бифунктора, трифунктора
кана
как мне нравятся однородный нейменг runIdentity, getConst, unFlip *sarcasm*
Aleksei (astynax)
runSmth - для монадок, get/un - для обёрток всяких (эти бы унифицировать, да). Для монадок ещё execX и evalX ещё есть помимо runX, так что пусть будут
Зигохистоморфный
Aleksei (astynax)
С линзами у тебя будет _X :)
Aleksei (astynax)
_X # x и y ^. _X - единообразненько
Зигохистоморфный
ну или Data.Newtype или как его там
Ilya
кстати, а как в хаскеле относятся к snake_case? для функций
Ilya
чё-то привык уже к нему из других языков
Anonymous
Anonymous
или даже бифунктор
Кабачок
кана
как? ((,) a b) при любом раскладе *, функтором быть не может
Anonymous
ну всмысле
кана
ты можешь заимплементить бифунктор для (,)
Anonymous
что это кортеж из трех элементов
кана
(,,) - из трех
Anonymous
о
Anonymous
точно..
Anonymous
Господа товарищи, а в Хаскелле до их пор нету тайп-лямбд, или я отстал от жизни?
кана
до сих пор нет
Anonymous
спасибо. а как они это объясняют?
Andrey
(надо было Paul Lyutko left the group) :)
Alex
я кстати в исходной формулировке линзы и не смотрел толком, сразу читал в профункторной
Alex
оно как то интуитивнее выглядит
Alex
вообще линзы пришли из исследований по bidirectional programming насколько я помню
Alex
пресловутый Пирс этим кстати занимался
Cheese
(неизвестный выходит из синей будки) а Applicative уже стал суперклассом Monad?
кана
да
Cheese
спасибо (неизвестный заходит в синюю будку)
Зигохистоморфный
монада Тардис!)
Anonymous
а вдруг комонада?
кана
так, линзы я раздуплил, теперь траверсаблы. И как их вообще композировать с линзами
Alex
в смысле траверсалы?
кана
type Traversal l l' s s' = forall f. Applicative f => (s -> f s') -> (l -> f l')