кана
Ilya
а вообще интересно, на какой клаве ты это набирал
кана
Это FiraCode шрифт с лигатурами от Тонского
Влод
глянь в Data.Function, там есть флипнутый оператор применения
я думаю это наибольшая из трудностей с которой он столкнулся. если бы он заранее знал что есть такая функция то дело шло куда быстрее
Alexander
поэтому линзы называют van Laarhoven
Alexander
т.к. Кметт их изобрёл
Ilya
я думаю это наибольшая из трудностей с которой он столкнулся. если бы он заранее знал что есть такая функция то дело шло куда быстрее
Не сомневаюсь. Учитывая, что hoogle даже по прямой сигнатуре "a -> (a -> b) -> b" её не выдает
кана
Но вот словесносное описание, писал в одной конфе: Линза - не пара из геттера и сеттера. Это ТОЛЬКО идентити, который еще запаковывает значение. Но обобщенный, то есть функции применяется к значениям не напрямую, а через функторы (что дает нам возможность внести в этот процесс идентити какой-то эффект, например изменение). Итак, что делает линза, основанная на геттере и сеттере: Линза принимает некую функцию pure', которая просто маленькое значение заворачивает в функтор (переносит в эффектфул мир). Далее линза принимает большое значение. С помощью геттера вытаскивает из него маленькое значение, переносит его в функтор через pure'. А потом применяет в эффектфул-мире (fmap) сеттер к объекту. То есть в прямом смысле вытащили значение и внесли его обратно, но сделали это в внутри функтора. И вся магия в том, что с помощью разных функторов и pure' можно делать разные вещи. Например, если сама по себе линза - такой идентити модификатор, то если отправить в нее конструктор функтора, который перед этим еще применяет к значению какую-нибудь функцию, то получится over. А если использовать Const, который позволяет обернуть значение в функтор, но потом не дает ничего с ним сделать через fmap, то на выходе мы получим контейнер с нетронутым маленьким значением внутри. Это view.
Alexander
и почему не назвать type Lens fromContainer fromValue toContainer toValue
Lens myAbstractParametricValueFromThatIInspect myAbstractParametricValueThatIWIllGet ?
Alexander
newOuter newInner это все неправильно
Alexander
т.к. работает не всегда
Alexander
а зачем путать себя?
Влод
Lens myAbstractParametricValueFromThatIInspect myAbstractParametricValueThatIWIllGet ?
не а текущая однобуквенная культура куда лучше?
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 шрифт с лигатурами от Тонского
У меня этот шрифт в терминале ужасно выглядит
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
или даже бифунктор
Кабачок
кстати, а как в хаскеле относятся к snake_case? для функций
Вроде плохо, lowerCamelCase предпочтительней
кана
как? ((,) 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')