Ш̴̴̜̥͍͕̼̙̱͙͎͍̘̀̐̔́̾̃͒̈̔̎́́͜р̧̛̺͖͖̯̖ͧͤ͋̅̽ͧ̈̐̽̆̐͋ͤͦͬ͛̃̑͞͞и̒ͥͤͯ͂ͣ̐̉̑ͫ̉̑҉̛͏̸̻͕͇͚̤͕̯̱̳͉ͅф̴̴̡̟̞͙̙̻͍̦͔̤̞̔̓́̍͗̚͢͞ͅт̨̐ͫ̂͊̄̃ͥͪ͏̫̺͍̞̼͈̩̥̜͔͜͜ы̸̴̱̺̼̠̦͍͍͍̱̖͔̖̱͉̅͑͌͒ͫ͒̀ͥ͐ͤ̅͘̕.̵̴̡̭̼̮͖͈̙͖͖̲̮̬͍͙̼̯̦̮̮ͦ̆̀̑̌ͮͧͣͯ̔̂́͟г͌ͮ̏̈͂ͯ̚҉̛̙̬̘̲̗͇͕̠̙͙̼̩͚̀͘͞ͅо̷̥̯̘̓ͤ̽͒̋̉̀̂̄̒̓̊ͨ͛́̌ͤ̂̀͠в̶̒͒̓̏̓̚҉̛̙̘̺̰̮̼̟̼̥̟̘̠̜͜н̸̷̸̲̝͈͙̰̟̻̟̰̜̟̗͎̻̻͍̿̔̃ͨ͑о̔̀̋ͫ̇̿̐ͫ͌͗ͩ҉̨̜̙̙͈͍̮̮̼̙̘̞̕͜͡ Войти !bnw Сегодня Клубы
У многих языков с неизменяемыми данными есть одна неприятная особенность: если надо поменять что-то в здоровой структуре данных где-то в глубине, приходится тяжко. Когда надо поменять одно поле в записи, это не страшно: http://stackoverflow.com/questions/14955627/shorthand-way-for-modifying-only-one-field-in-a-record-copy-a-record-changing . Аналогичный синтаксис есть и у Эрланга, и у F#, и наверняка ещё до фига у кого (думаю, у большинства даже). А вот возможности поменять _одно_ грёбаное поле в середине здорового дерева нет ни у кого... Даже у F#, у которого она просто таки напрашивается, на мой взгляд, из синтаксиса. Можно конечно всякий раз заливать, что раз, мол, языки функциональные, так пусть все куски, которые требуется менять, и будут функциями, но это не всегда удобно. Например, (де)сериализация функциональной структуры данных -- геморрой, а если между сериализацией и де сериализацией успел поменяться код, то серьёзный геморрой. За что такая несправедливость, и чем себя утешить?
#DXL5ZQ / @dluciv / 3269 дней назад

Ты же не руками данные там копируешь туда-сюда. Хули разнылся, мммМ?
#DXL5ZQ/7YF / @anoos / 3269 дней назад
@lexszero бан за пиар параши
#DXL5ZQ/RMH / @anonymous --> #DXL5ZQ/VJ3 / 3269 дней назад
@lexszero Оно конечно да, но почему сразу в язык не встроить? Было бы проще, удобнее и быстрее...
#DXL5ZQ/WLD / @dluciv --> #DXL5ZQ/VJ3 / 3269 дней назад
>(де)сериализация функциональной структуры данных -- геморрой, функциональность не при чём совершенно
#DXL5ZQ/PJV / @anonymous / 3269 дней назад
@anonymous "не" тут тоже _ни_ при чём, бро
#DXL5ZQ/8DV / @dluciv --> #DXL5ZQ/PJV / 3269 дней назад
@anoos Вот пример на F# ``` type Nrt = { NX: int; NY: int };; type Ort = { XY: Nrt; OZ: int };; let ort1 = { XY = { NX = 1; NY = 2 }; OZ = 3 };; ``` И когда я делаю так: ``` let ort2 = { ort1 with XY.NX = -1; OZ = -3 };; ``` То F# мне в ответ предлагает хер в томате. Я досадую.
#DXL5ZQ/NVK / @dluciv --> #DXL5ZQ/7YF / 3269 дней назад
@dluciv вообще там пидораха штоле, собственного языка не знаешь?
#DXL5ZQ/OMM / @anonymous --> #DXL5ZQ/8DV / 3269 дней назад
@folex Линзы клёвые, я ж не спорю. Я ими не пользовался, но по описанию как раз то, что надо. Не ясны две вещи: 1. Какого фига оно не из коробки? Ну правда... 2. Что делать при программировании не на Хаскелле.
#DXL5ZQ/2DD / @dluciv --> #DXL5ZQ/XW3 / 3269 дней назад
@dluciv 1. Потому что "из коробки" выглядело бы точно так же. 2. А где их нету? В скалке есть, например. В F# нету что ли?
#DXL5ZQ/YSO / @folex --> #DXL5ZQ/2DD / 3269 дней назад
@folex В F# нету. Можно изгальнуться, но родных нет: http://bugsquash.blogspot.ru/2011/11/lenses-in-f.html
#DXL5ZQ/0DN / @dluciv --> #DXL5ZQ/YSO / 3269 дней назад
@dluciv https://kolektiv.github.io/fsharp/aether/2014/08/10/aether/ вот еще. Вот их и юзай, чо ты как маленький: "встроенное-не встроенное".
#DXL5ZQ/K7R / @folex --> #DXL5ZQ/0DN / 3269 дней назад
@folex недостаточно синтаксического сахара
#DXL5ZQ/MMX / @lexszero --> #DXL5ZQ/K7R / 3269 дней назад
@lexszero нет сливок
#DXL5ZQ/EYW / @folex --> #DXL5ZQ/MMX / 3269 дней назад
@folex То я как маленький, что такой прибамбас я и сам могу написать. Геттер/сеттер и херню, которая делает их суперпозицию для построения "оптических систем", применяя сеттеры снизу вверх наваять несложно. Ну да, в приведённых примерах оно уже красивое и продуманное. Если делать самому, то продумано и красиво получится раза с третьего. Проблема не в том, что линзы плохие. Линзы хорошие. С поправкой на существующее положение вещей. Проблема в ответе. Вместо отвечать "юзай линзы, это именно то, что надо", можно бы было ответить "юзай линзы, лучше всё равно ничего пока ещё не сделали".
#DXL5ZQ/RG2 / @dluciv --> #DXL5ZQ/K7R / 3269 дней назад
@dluciv То есть ты просто придираешься, и сам это понимаешь. Ну оки, чо.
#DXL5ZQ/WKN / @folex --> #DXL5ZQ/RG2 / 3269 дней назад
@folex Да нет же. Я хочу не писать руками кучу очевидных одинаковых (и поэтому бессмысленных) функций, а сразу написать ```let newRec = oldRec { nestedRec.nestedNestedRec.intField = 1 }```, и не думать об этом.
#DXL5ZQ/XJ2 / @dluciv --> #DXL5ZQ/WKN / 3269 дней назад
@dluciv Я понимаю,. И ты тоже вроде понимаешь, что такого нет, чего ныть-то? Ну захуярь сам умной кодогенерации (в ФШ есть макросы, интересно?), будешь в шоколаде.
#DXL5ZQ/K2S / @folex --> #DXL5ZQ/XJ2 / 3269 дней назад
@folex Макросы и удобные простые примитивы для претрансляции в Эрланге. В F# и Хаскелле надо компилятор хекать вроде как. Если бы надо было сильно много где, то м.б. и забацал бы. Я просто недоумеваю, почему этого не сделали раньше...
#DXL5ZQ/F3Q / @dluciv --> #DXL5ZQ/K2S / 3269 дней назад
@dluciv в хуцкеле есть макросы же. Квазикавычки там всякие. У меня вот ни разу не возникало таких структур данных, в которых нужно было бы лезть на пять уровней вглубь. Максимум: data.copy(params = data.params.copy(something = anything)), и всё.
#DXL5ZQ/67Y / @folex --> #DXL5ZQ/F3Q / 3269 дней назад
@folex С другой стороны это не так часто надо, а для таких ситуаций я и тупые геттеры/сеттеры написать не тресну, уговорил. Как раз если бы было часто надо, то и было бы в языке...
#DXL5ZQ/3Y1 / @dluciv --> #DXL5ZQ/67Y / 3269 дней назад
в окамле есть синтаксис { r with f1 = e1; ...; fN = eN } -- "создать запись, взяв за основу все поля r, заменив значения только указанных полей". Помогает, но редко оно нужно, что-то глубокое менять. Как-то по-другому всё делается, но, может, это у меня такие задачи постоянно.
#DXL5ZQ/8BS / @gds / 3269 дней назад
@gds Да, есть. Меня тут уже, можно сказать, убедили, что если надо часто лазать глубоко, то можно либо линзы заюзать, либо свои такие же написать. Ибо всё равно не часто.
#DXL5ZQ/8TI / @dluciv --> #DXL5ZQ/8BS / 3269 дней назад
Ебанулись все со своими линзами ппц. data-accessor полущ.
#DXL5ZQ/PPD / @l29ah / 3269 дней назад
@l29ah О, не знал про такой. Ваще ништяк, я в принципе его и искал.
#DXL5ZQ/9QS / @dluciv --> #DXL5ZQ/PPD / 3269 дней назад
@dluciv На хекедже есть ещё data-accessor-* с генераторами аксессоров для всякой модной хуйни на TH.
#DXL5ZQ/GYN / @l29ah --> #DXL5ZQ/9QS / 3269 дней назад
@lexszero Это оберег от рака, гордись!
#DXL5ZQ/QG7 / @minoru --> #DXL5ZQ/MMX / 3269 дней назад
@folex Во, с третьего где-то и получилось сносно: let (^.^) = (<|) // right assoc type InnerRec = { i1 : int } type MiddlRec = { m1 : InnerRec; m2 : int } type OuterRec = { o1 : int32; o2 : MiddlRec } let upd_InnerRec_i1 (vl: int) (r: InnerRec) = { r with InnerRec.i1 = vl } let upd_MiddlRec_m1 (st: InnerRec -> InnerRec) (r: MiddlRec) = { r with MiddlRec.m1 = st(r.m1) } let upd_OuterRec_o2 (st: MiddlRec -> MiddlRec) (r: OuterRec) = { r with OuterRec.o2 = st(r.o2) } let or1 : OuterRec = { o1 = 1; o2 = { m1 = {i1 = 2}; m2 = 3 }} let or2 = or1 |> upd_OuterRec_o2 ^.^ upd_MiddlRec_m1 ^.^ upd_InnerRec_i1 -2 printfn "%A\n---->\n%A" or1 or2
#DXL5ZQ/YMT / @dluciv --> #DXL5ZQ/WKN / 3268 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.