Монокль объектив: Доступ ограничен: проблема с IP

Монокль. Объектив для души и творчества

Ворвавшаяся в нашу жизнь цифровая фотография, не только успела основательно в ней укорениться, занять все доступное пространство, но с неимоверной взрывной скоростью, продолжает свое развитие, радуя техноманов новыми возможностями современных фотокамер и объективов. Каждый год производители фототехники удивляют нас новыми технологическими достижениями о которых раньше можно было только мечтать.
Гонка за резкостью, повышением «рабочей чувствительности» современных матриц, снижением цифрового шума, внедрение стабилизатора изображения в фотокамеры — все это будоражит умы и, порой, отвлекает от самого главного — от творчества.

На фоне безудержных восторгов со стороны любителей нового, мы с вами наблюдаем небольшие группы фотохудожников, испытывающих интерес к мягкорисующей оптике, позволяющей создавать пиктореальные художественные произведения. В работах этих фотографов Вы не найдете фотокарточки с безупречным техническим качеством изображения, которое так любят глянцевые журналы и фотостоки.

Рассматривая работы фотохудожников, увлеченных пиктореальной фотографией, Вы сможете прикоснуться к другому миру.
Чем же так привлекателен монокль для фотографов? Здесь уместно будет процитировать нашего соотечественника Георгия Колосова.


«Анастигмат изображает поверхность, которую можно потрогать. Монокль позволяет изобразить пространство, недоступное для осязания».

 

Монокль — однолинзовый мягкорисующий объектив. Монокль состоит из одной вогнуто-выпуклой линзы. Обычно светосила у такого объектива колеблется между значениями 2,8 и 5,6. Монокль может использоваться для пейзажной, портретной и жанровой фотосъемки.

Производители фототехники не выпускают таких однолинзовых объективов. Во времена пленочной фотографии и становления цифровой, фотолюбители для своего творчества монокли изготавливали самостоятельно. В настоящее время есть небольшие фирмы, которые берутся изготовить под вашу фототехнику объективы.

 

Развитие творчества происходит волнами. В современном обществе на первый план снова выдвигается субъективный взгляд художника, позволяющий показать не обобщенное мнение толпы, а искреннее личное, подчас даже интимное переживание творческой личности окружающей действительности, которую нам щедро преподносит современный мир. Для того чтобы уйти от банальной, набившей оскомину, современной цифровой картинки, грешащей излишней детализированностью, фотографы в своем творческом поиске возвращаются к моноклю и другим мягкорисующим объективам. Так появляются чудесные образцы пиктореального искусства, окутанные пеленой мечтательной вдумчивости и лишенные современной крикливой суетности.

Стоит отметить, что пиктореальная фотография на монокль требует от фотохудожника определенного уровня технической грамотности и духовности. Если Вы предпочитаете фотографировать на бегу с использованием автоматического режима фотосъемки, то монокль вряд ли Вас обрадует. Скорее всего Вы разочаруетесь, не поймете и не почувствуете его возможностей.

 

 

Особенности фокусировки при съемке моноклем

Одним из наиболее важных технических моментов при пиктореальной фотосъемке с использованием монокля является процесс фокусировки. Если у вас уже есть навыки по фотосъемке с ручной настройкой фокуса, Вам будет проще разобраться в тонкостях этого процесса при фотосъемке на монокль, но будьте готовы к тому, все равно вам придется привыкать к новым тонкостям.

Давайте разберемся в технической стороне процесса фокусировки при использовании монокля.

Стоит сразу отметить, что при использовании монокля на современной цифровой фотокамере, Вы не сможете воспользоваться подсказкой камеры при наведении фокуса. В упрощенном варианте этот процесс выглядит следующим образом — Вы прокручиваете на объективе колесо фокусировки и при достижении максимального контраста камера подсвечивает вам центральный датчик, сигнализируя о том, что объект находится в фокусе. Когда мы с вами пользуемся моноклем камера пытается по точно такому же алгоритму определить контраст, но все дело заключается в том, что на монокле максимальная контрастность и резкость достигаются в разные моменты, в отличии от современных объективов.

Для тренировки наведения фокуса на монокле стоит в «домашних условиях» потренироваться. Нам с вами понадобится объект с хорошим контрастом. Для упрощения воспользуемся обычным жидкокристаллическим монитором. Создадим в текстовом редакторе Word документ в виде белого листа на котором набрано несколько крупных символов. Для этого на стандартный А4 лист разместим 5-6 символов и несколько черных линий так, как показано на рисунке.   

Откройте данный документ так, чтоб он был открыт на весь экран. На фотокамере настройку выбора режима фотосъемки переводим в мануальный режим (М). Устанавливаем значение диафрагмы 5.6. Расстояние между экраном монитора и фотоаппаратом 1,5 — 2 метра. Желательно, чтоб камера была расположена строго перпендикулярно поверхности монитора. При данном эксперименте по настройке фокуса лучше воспользоваться штативом. Поворачиваем фокусировочное кольцо объектива на минимальное фокусное расстояние, при этом в видоискателе фотокамеры мы с вами будем видеть только сильно размытое светловатое пятно от экрана. Медленно начинаем проворачивать фокусировочное кольцо в сторону бесконечности. Сначала появится ощущение различия букв. Продолжаем проворачивать фокусировочное кольцо. Добиваемся того, чтоб буквы были хорошо различимы, а тонкие полоски под ними стали максимально резкими. При этом у нас с вами в видоискателе черный цвет букв не должен быть максимально черным, как и белый цвет фона листа. Этот момент и является точкой максимальной резкости картинки. Если мы еще чуточку сдвинем фокусировочное кольцо, то контраст повысится, а резкость картинки наоборот начнет снижаться. Одновременно с потерей резкости так же начнет утихать ощущение воздушности, присущее фотоснимкам, сделанным на монокль. После удачно проделанного эксперимента, усложните условия — отойдите от экрана монитора на 3-4 метра и повторите алгоритм по фокусировке монокля.

После тренировки дома в «тепличных условиях» вам предстоит потренироваться с моноклем на улице при реальных световых условиях. Стоит начать свою тренировку с каких-то простых объектов. Для тренировки отлично подойдут ветки деревьев, столбы, провода между столбами, металлические решетки и другие контрастные объекты.

Стоит обязательно упомянуть о том, что у вас, при использовании монокля, появляется еще один инструмент для самовыражения — резкость. Вы с помощью резкости сможете подчеркнуть наиболее важные детали и задать общий тон по восприятию вашего произведения. Данный процесс можно сравнить с солеными огурцами. Кто-то любит поострее, а кто-то наоборот любит помягче. Не забывайте о том, что у каждого свой вкус и предпочтения.

Сам по себе монокль не гарантирует того, что Вы снимите выдающуюся фотографию. Монокль — это всего лишь инструмент, которым надо понять его возможности и недостатки, научиться управлять ими и при должном терпении и труде Вы сможете создать что-то интересное.

 

Советы по пиктореальной фотосъемке

 

.   

Монокль из Гелиоса 44М — Сушников Евгений — ЖЖ

Собрал тут себе парочку моноклей. Снова ездили на дачу к Лёше в СОТ Колос (круглый дом, рыба в печке, коровоки и панорамные виды ранее в заметке про СОТ Колос). Там же и опробовал свежесобранный объектив и плёнку Kodak Ektar 100, получилось здорово, мне нравится.

Монокль – это простейший мягкорисующий объектив, использующий всего одну линзу. Монокль дает характерный мягкий рисунок, позволяющий получить изображение со сниженными контрастами и сферической аберрацией (от латинского aberratio — отклонение, искажение), которая дает «свечение» у ярких объектов, на темном фоне.

Светлая точка на темном получается светящейся, ореолом подавляя соседние черные точки; соответственно на светлом фоне подавляется темный штрих, и тем сильнее, чем выше перепад яркостей. В результате тают электрические провода на фоне неба, морщины на ярко освещенной щеке и т. п. Пока мы не концентрируем внимания, наше визуальное восприятие обращается с мелкими деталями точно так же.1

2. Как говорят на официальном сайте, плёнка Kodak Professional Ektar 100 самая мелкозернистая в мире. Вправду ведь. И цвета знатные.

3. Маша Бирдигулова.

4. Это ходили панорамные виды смотреть на Анапу, пока дошли солнце уже село и вот, колоски с луной получились. А панорамы с того места на горе в заметке про СОТ Колос.

5. Обратно стопом, остановились у элеватора в пшеничном поле. Против солнца получилась вот такая радуга, вместо блика в левом углу.

6. Заросли чертополоха или татарника колючего. Очень колючие растения, как кактусы. И сам цветок колется и стебель и всё всё.

Говорят монокль хорошо для портретов, вот попробовал парочку. Здесь плёнка Kodak Professional ProFoto 100 и фотоаппарат Praktica MTL 50. Для пробы фото на цветную плёнку перевел в лайтруме в ч/б. Вообще говорят на ч/б плёнку лучше моноклёвый эффект из-за другого состава самой плёнки или проявителей.

7. Дипломированный дизайнер Ташимова Нина.8. Художник и преподаватель Геннадий Завизионный.

&nbsp&nbsp

&nbsp&nbsp

9. Зенит с моноклем и вырезанной диафрагмой.

10. Это самый первый, который я сделал. Из гелиоса 44м-6, просто перевернул переднюю линзу, вытащил все остальные и добавил среднее и маленкое макрокольца плюс между ними медная проволока для юстировки на бесконечность.

Сейчас уже сделал ещё два: монокль из передней линзы Юпитер 8, вставленной в Гелиос 44м (фокусное примерно 60 мм, светосила примерно 2,8) и монокль из первой линзы передней склейки объектива Юпитер 8, вставленной в Гелиос 44м-2 (фокусное примерно 45 мм, светосила примерно 2-2,8). Для этих внешняя диафрагма не нужна, так как линза вставляется в задник объектива и стандартная диафрагма работает, но можно поэксперементировать и с внешними.
Снимать из Юпитера 8 могут примерно так http://drubin.livejournal.com/342304.html

11. Моноклевый эффект уменьшается по мере закрытия диафрагмы, например на 1/11 будет практически незаметен, а лучше всего проявляется на 1/2 до 1/5,6. Наружние диафрагмы вставляются спереди стекла обектива, так правильней и лучше:


  1. Притенить небо
  2. Сделать боке в виде сердечек. На монокле не работает, а вот на обычном забавно получается.
  3. Горизонтальные линиее останутся чёткими, вертикальные станут более размытыми. Ещё не пробовал, но говорят работает.
  4. Например если поставить вертикально, то стволы деревьев будут чёткими, а ветки размоются.
  5. Просто дырки разных размеров, 22мм для помещения, 18-16мм днём

Остается добавить, что незначительно изменяя диафрагму, можно легко получить и туманный импрессионистский этюд, и совершенно ясную, в меру детализированную картину, реалистичную настолько, что ее живое пространство втягивает в себя почти как стереопара.1

Все мои фото можно посмотреть по тегу «Монокль».

Совершенно не знаю, как ко мне пришла эта информация, но ещё неделю назад я и не знал, что такое монокль. Всего начитался, как раз был ненужный гелиос, и пошло поехало, уже четыре объектива разобрал.

Ссылки по моноклестроению или как сделать монокль из объектива Гелиос 44М (постоянно будут пополняться).
По поиску «монокль из гелиос 44» очень много информации. Три дня и три ночи всё изучал и вот что самого понятного я нашёл:


  1. Главные статьи, на которые ссылаются все в интернете. Там же статья Георгия Колосова «Монокль на малоформатной камере» из которой станет понятно, что по чем и для чего.
    http://photo-element.ru/#mo
  2. slava_zitev из Петербурга собирает и продаёт монокли на своём сайте http://www.monolens.ru/
    Хороший понятный сайт, мне был полезен, там же примеры снимков.
    Для начала смотрите видео, из которого всё понятно про монокли «Монокль на фотокамере» http://youtu.be/yC_nwQVirSY
    И ещё «Монокль за полторы минуты» http://youtu.be/bchEDa-uPqA
    Слайд-шоу из наиболее интересных снимков которые я получал за последнюю пару лет http://vimeo.com/33708480

    Вот его пост, где много примеров снимков, сделанных покупателями его моноклей
    http://slava-zitev.livejournal.com/54343.html
    Его снимки
    http://slava-zitev. livejournal.com/tag/моноклевое

    Из группы Вячеслава http://vk.com/monolens видеозапись 2 часа первого занятия Александра Рощина из цикла «Классический монокль в творческой фотографии» прошедшего 24 ноября 2012г. в фотоцентре FOTO-ONE.
    http://vk.com/video-29660205_163857860

  3. Отличный пост с примерами фотографий, как из множества самых распространённых советских объективов собрать различные монокли.
    Сам я сделал себе по этой статье монокль из передней линзы Юпитер 8, вставленной в Гелиос 44м и монокль из первой линзы передней склейки объектива Юпитер 8, вставленной в Гелиос 44м-2.
    http://ru-foto.livejournal.com/38026802.html
  4. Когда читаешь статьи, много непонятных терминов, вот самый удобный справочник. Вообще хороший сайт Красногорского завода: и статьи, и ссылки, и про объективы, и про фотоаппараты. Достоверная информация от производителя.
    Фотографические термины и понятия
    http://www.zenitcamera.com/qa/qa-terms.html
  5. Тоже была весьма полезно. Доходчиво.
    Монокль — основная информация
    http://fotoivlencov.narod.ru/monokl.htm
  6. Статья на сайте нижегородских фотографов. Там понятно, как сделать монокль из задней линзы гелиоса 44
    Что такое Монокль?
    http://www.photogorky.ru/magazine.php?article=3
  7. Фокусировка при съемке моноклем
    http://slava-zitev.livejournal.com/85855.html
  8. Здесь тоже хорошо написано и есть хитрости с диафрагмами
    Монокль из объектива МС Гелиос-44К (байонет)
    http://www.pinhole.ru/index.php?option=com_content&view=article&id=26:—a&catid=16&Itemid=57
    Кружок оч.умелые ручки или про то, как из нормального объектива сделать чёрте чё неразрушающими методами. Про внешние диафрагмы, есть формула.
    http://drubin.livejournal.com/227926.html
  9. Подход к фотографии как искусству, близкому к живописи, искусству, которое отличается от живописи только технической реализацией получения изображения, был характерен с самого начала ее изобретения.
    Русская пикториальная фотография
    http://www. luckylife.ru/ruspictphoto/
    http://www.realshot.ru/articles/pictorial.html
  10. Сообщество «Крайности фотографии» sharp_n_blur посвящено пикториальной фотографии (пинхол — без линз и монокль — одна линза)
    И ещё у смотрителя сообщества Дмитрия Рубинштейна в журнале много снимков
    http://drubin.livejournal.com/tag/Монокль

Если вы знаете хорошие статьи, хитрости и штуки, делитесь, оставляйте комментарии.
Такие дела.

Игорь Новиков рассказал нам свою историю о том, как он пришел в мир фотографии и почему остановился именно на пейзажной фотографии.

Игорь НОВИКОВ – влюбленный в монокль

3 ноября 2011

«Фотографией я увлекся шесть лет назад. До этого, как большинство, «щелкал» в стиле «Ося и Киса были здесь». Гораздо больше меня интересовала живопись, вот и до сих пор меня особенно привлекают именно изобразительные аспекты фотографии. Может быть, поэтому я и «застрял» в пейзаже. Если не считать отпускного времени, фотографирую по дороге на работу или с работы – благо, ботанический сад под боком.

Сначала снимал простенькой пленочной мыльницей, потом приобрел свою первую зеркалку. Кстати, тогда и появился на фотосайтах (в первую очередь, на club.foto.ru) мой персонаж – Балаганов Шура. Но однажды я увидел работы, выполненные моноклем, и  просто влюбился в эту линзу! Благодаря специфическим особенностям монокля на картинке можно было увидеть именно то, что я хотел. А тут, очень кстати, знакомый по фотосайту продавал монокль работы Георгия Колосова. Так у меня появилась первая моноклевая линза, достаточно стандартной конструкции — из Гелиоса, 85мм. Правда, все уверяли, что снимать моноклем можно только на черно-белую пленку (в купленном мной монокле даже был жестко закреплен желтый фильтр). А мне хотелось цвета. В результате я выковырял фильтр и попробовал снимать на цветной негатив. Так «пополам» сейчас и снимаю: и цвет, и ч/б.

 

 

Фотографирую на узкую пленку. Основной аппарат: Pentax MZ-M – это наверное самая дешевая (если не считать Зенитов), компактная и легкая зеркалка. Главное, она превосходно работает с любыми механическими объективами, в том числе, и с отечественными — через переходник М42. Снимать пейзажи на 85мм не очень удобно, а город – вообще практически невозможно. Поэтому я очень обрадовался, когда смог получить монокль 33мм, тоже работы Колосова. Короткофокусный монокль, как оказалось, имел очень интересный рисунок – своеобразную закрутку по краям кадра. Получался этакий вихревой эффект, особенно ярко проявляющийся на черно-белом изображении. Не менее важна для меня и его компактность – в комплекте с MZ-M он практически не отличается по весу и размеру от средней пленочной мыльницы.

 

 

Снимать на монокль одновременно и просто и сложно. Во-первых, следует учитывать, что эта линза играет именно на тех эффектах — аберрациях, виньетировании, световых ореолах — от которых так пытаются избавиться все «нормальные» линзы. Во-вторых, нет одинаковых моноклей. Даже изготовленные по одной и той же широко описанной технологии (Гелиос-44), чаще всего они дают разные картинки. Вероятно, за счет ручного изготовления, специфических для однолинзовых конструкций эффектов, монокль обладает собственным характером. Можно сказать, что он живой. Часто складывается впечатление, будто твой объектив сам решает, что ему отображать. Выбираешь по всем правилам кадр, а проявив, видишь, что картинки нет. А вот фотография, снятая просто под настроение — вдруг играет необычными красками и рисунком.

 

Кроме того, монокль гораздо чувствительнее обычных объективов к особенностям используемой пленки. Кадры, снятые, например, на Fuji и Kodak, в одно и то же время и в том же месте, могут совершено отличаться по цвету. Бытует мнение, что монокль – линза только для солнечной погоды, или только «портретная». Однако это не так. Очень интересно получаются ночные городские сюжеты. Тут вспоминается и знаменитая «туманная» серия Колосова, отснятая в дни, когда Москва была затянута дымом горевших торфяников. И еще: необходимо учитывать, что на монокле черно-белые кадры получаются зрительно гораздо более «резкими», чем цветные.

 

 

Существуют и аналоги монокля у известных фирм, так называемые, софт-объективы. Скажем, они есть у фирм Canon и Pentax. Очень удобно, что на них можно играть диафрагмой по месту, подбирая силу эффекта. Единственный их «недостаток» – цена… Самый дешевый софт-объектив Pentax тянет под полтысячи «зеленых президентов», а Canon и того дороже. Правда, год назад в США появился очень забавный объектив – так называемый, lens-baby. Это тот же однолинзовый объектив, но насаженный на гибкую оправу, позволяющую изменять не только  расстояние от линзы до пленки, но и наклонять линзу относительно плоскости пленки. В результате можно получать совершенно необычные эффекты (например, как на фотографии «Закрученная клумба»).

 

Контакт 911-20-27 [email protected]

Игорь Новиков рассказал нам свою историю о том, как он пришел в мир фотографии и почему остановился именно на пейзажной фотографии.  

___________________________

Читайте также:

Лучшие работы пользователей rosphoto.com В этом номере мы решили опубликовать самые лучшие фотоработы пользователей rosphoto.com. 

Серия «Эскимосская охота» была сделана в первых числах августа 1980 года в поселке Сиреники Провиденского района Чукотки. 

611 Monocle Lens Стоковые фото, картинки и изображения

Золотой монокль с кружевом изолирован на клетчатом прозрачном фоне. реалистичные векторные иллюстрации.PREMIUM

Набор различных оптических инструментов. стильный позолоченный ретро-монокль, старинный и современный телескоп, астрономия, наблюдающая за звездами, выдвижная подзорная труба, бинокль, лупа, просмотр текста. vector cartoon see.PREMIUM

Quizzing glass ink sketch.PREMIUM

Найти поисковый глаз один изолированный значок с заполненной линией и контуром плоского стиля векторная иллюстрацияPREMIUM

Гусь с векторной гравировкой на монокле. имитация стиля скретч-борда. черно-белое рисованное изображение. ПРЕМИУМ

Старый монокль очки вектор значок на белом фоне. найти значок, исследовать концептуальный символ. глаз с увеличительным стеклом. PREMIUM

Гусь с моноклем, гравировка векторной иллюстрации. имитация стиля скретч-борда. черно-белое рисованное изображение. ПРЕМИУМ

Золотой монокль с цепью — современная векторная реалистичная изолированная иллюстрация объекта. Старомодные винтажные часы-монокль с гравировкой векторной иллюстрации. дизайн печати одежды на футболках. имитация скретч-борда. черно-белое рисованное изображение. ПРЕМИУМ

Старые лорнеты. винтажные очки. чернильный набросок. Ретро стиль. ручной обращается вектор значок на белом фоне. ПРЕМИУМ

Руки держат стильные творческие очки для зрения на желтом фоне. оптика для зрения conceptPREMIUM

Золотой монокль на шнурке, золотой лорнет на ручке. реалистичная трехмерная векторная иллюстрация. PREMIUM

Мальчик смотрит в монокльPREMIUM

Монокль изолированные векторные иллюстрации тень и фон находятся на отдельных слоях. прозрачная линза. легкое редактирование.ПРЕМИУМ

Стеклянный эскиз чернил. ПРЕМИУМ

Значок пенсне. редактируемый контур с цветовой заливкой. векторная иллюстрация.PREMIUM

3d графическое изображение линзы вертикально вместе с текстом, построенным металлическими кубическими буквами сверху, отлично подходит для презентации концепции и слайд-шоу, 3d illustrationPREMIUM

Рука держит старый винтажный лорнет середины девятнадцатого века на белом фонеPREMIUM

Очки для чтения на посохе в виде лорнетаPREMIUM

Мальчик смотрит в монокльPREMIUM

Держите в руке старый винтажный лорнет середины девятнадцатого века на белом фонеPREMIUM

3d очки на белом фоне. трехмерный фильм. погружение в фильм. изолированныйПРЕМИУМ

Лупа со значком контура глаза. найти значок, исследовать концептуальный символ. глаз с увеличительным стеклом. внешний вид, аспект, взгляд, взгляд, творческое видение значок для веб и мобильных устройств — vectorPREMIUM

3D-очки для кинотеатра на белом фоне, изолированныеPREMIUM

Мальчик смотрит в монокльPREMIUM

Золотой монокль на цепочке и шнурке. реалистичная трехмерная векторная иллюстрация. PREMIUM

Рука держит старый винтажный лорнет середины девятнадцатого века на белом фоне. молодой человек в кожаном жилете и винтажном стиле. PREMIUM

Монокль значок. винтажное зрелище. джентльмен стеклянная линза на белом фонеПРЕМИУМ

Красивые капли дождя в очках. выборочный фокусPREMIUM

Очки, размещенные на листе с буквами, чтобы можно было регулировать обзорPREMIUM

Значок старых круглых очковPREMIUM

Значок пенсне. черный на белом фоне с тенью. векторная иллюстрация.PREMIUM

Очки, размещенные на листе с буквами, чтобы иметь возможность регулировать вид.0002 Рука держит старый старинный лорнет середины девятнадцатого века на белом фоне. простая иллюстрация 9 иконок видения для webPREMIUM

Монокль и усы. значок старомодных джентльменских аксессуаров. винтажный или хипстерский стиль. векторная иллюстрация.PREMIUM

Очки, помещенные на лист с буквами, чтобы иметь возможность регулировать видPREMIUM

Очки, помещенные на лист с буквами, чтобы иметь возможность регулировать видPREMIUM

Механик-исследователь в стиле стимпанк с моноклем и большим количеством линз смотрит на что-то. Молодой человек в кожаном жилете и винтажном стиле смотрит вперед. ПРЕМИУМ

Руки держат стильные креативные черные очки на желтом фоне. Концепция зрения, бизнеса и образованияPREMIUM

Набор иконок для осмотра глаз, мультяшный стильPREMIUM

Черно-белый силуэт монокля. хипстерская векторная иллюстрация для наклейки сертификата подарочной карты. ПРЕМИУМ

Значок пенсне. плоский цветной дизайн лестницы. векторная иллюстрация.ПРЕМИУМ

Иллюстрация векторной иконки старинных очков. чернильный набросок пенсне. винтажные очки. эскиз чернил, изолированные на белом фоне. старые очки векторный эскиз.PREMIUM

Винтажный значок монокляPREMIUM

Монокль с векторной иконкой палки на белом фонеPREMIUM

Исследователь в стиле стимпанк, механик монокля с большим количеством линз, смотрящий на что-то. скопируйте пространство справаPREMIUM

Найдите ищущий глаз один изолированный значок с векторной иллюстрацией градиентного стиляPREMIUM

Карта разума оптика, концепция здоровья для презентаций и отчетов. ПРЕМИУМ

Монокль или очки, усы и галстук-бабочка. значок старомодных джентльменских аксессуаров. винтажный или хипстерский стиль. vector illustration.PREMIUM

Монокль хипстерский эмодзи с одной линзой на глазуPREMIUM

3d очки на белом фоне. трехмерный фильм. погружение в фильм. изолированныйПРЕМИУМ

Лупа с черным контуром глаза. кнопка поиска вектор изолированных иллюстрацияПРЕМИУМ

Монокль или туристический телескоп на смотровой площадке с городским пейзажемPREMIUM

Держите в руке старый винтажный лорнет середины девятнадцатого века на белом фонеPREMIUM

Комплект оптики — современный векторный реалистичный изолированный клип. редактируемый жирный контур с цветовой заливкой. векторная иллюстрация.PREMIUM

3d очки на белом фоне.PREMIUM

Монокль хипстерский эмодзи с одной линзой на глазуPREMIUM

Монокль значок цифровой синийPREMIUM

Значок глаза с увеличительным стеклом. поисковый знак. символ обзора. вектор изолирован на белом. ПРЕМИУМ

Монокль и усы. значок старомодных джентльменских аксессуаров. винтажный или хипстерский стиль. векторная иллюстрация.PREMIUM

Найти ищущий глаз один изолированный значок с плоской векторной иллюстрацией.0002 Винтажный векторный значок монокля на белом фоне. PREMIUM

Значок пенсне. черный на оранжевом фоне. vector illustration.PREMIUM

Красивые капли дождя в очках. селективный фокусPREMIUM

Лупа с иконкой контура глаза, нарисованная вручную в стиле каракули, vectorPREMIUM

Значок монокля в плоском стилеPREMIUM

3d очки на белом фоне. трехмерный фильм. погружение в фильм. изолированныйPREMIUM

Хипстерский монокль с одной линзой на глазуPREMIUM

Иконка с лупой с глазом. набор иконок тонкая линия. векторная иллюстрация. stock image.PREMIUM

Глаз со значком увеличительного стекла. поисковый знак. символ обзора. вектор изолирован на белом.PREMIUM

Бесшовный векторный монокль повторяет геометрический желтый цвет для любого дизайна. найти значок, исследовать концептуальный символ. глаз с увеличительным стеклом. внешний вид, внешний вид, вид, вид, значок творческого видения для веб и мобильных устройств — на складе ПРЕМИУМ

Значок пенсне. редактируемый жирный контур с цветовой заливкой. векторная иллюстрация.PREMIUM

Пенсне старый ретро старинный значок акций векторная иллюстрация на сером фонеPREMIUM

Значок глаза с увеличительным стеклом. simple vector illustrationPREMIUM

Лупа со значком контура глаза. найти значок, исследовать концептуальный символ. глаз с увеличительным стеклом. внешний вид, вид, внешний вид, вид, значок творческого видения для веб и мобильных устройств — вектор на складPREMIUM

Плоская иконка с черной линзой для веб-дизайна. бизнес значок. векторная иллюстрация. stock image.PREMIUM

Значок с лупой с глазом. набор иконок тонкая линия. векторная иллюстрация. stock image.PREMIUM

Очки, помещенные на лист с буквами, чтобы иметь возможность регулировать видPREMIUM

Оперные очки, иллюстрация, вектор на белом фоне. PREMIUM

Очки, помещенные на лист с буквами, чтобы иметь возможность регулировать видPREMIUM

Набор иконок Vision, мультяшный стильPREMIUM

Значок винтажных очков на белом фоне. простая иллюстрация элемента из другой концепции. старинные очки значок дизайн символа. ПРЕМИУМ

значок пенсне. смелый дизайн контура с редактируемой шириной штриха. vector illustration.PREMIUM

Хипстерский монокль с одной линзой на глазуPREMIUM

Хипстерский монокль с одной линзой на глазуPREMIUM

Значок пенсне. редактируемый жирный контур с цветовой заливкой. векторная иллюстрация.ПРЕМИУМ

Оптика за линзами с моноклем —

Если вы уже какое-то время работаете на Scala, то, вероятно, знакомы с концепцией линз. Он получил большую поддержку в сообществе, так как решает очень распространенную проблему изменения глубоко вложенных классов case. Но что не так общеизвестно, так это то, что подобных абстракций больше. Обычно они обозначаются как Оптика .

В этом посте я постараюсь представить некоторые из них и дать некоторое представление о возможных применениях для них. Эта статья больше ориентирована на приложения, чем на математические основы. Более того, он пытается подчеркнуть, что идея Optics идет гораздо дальше, чем манипулирование вложенными записями.

В этом посте я буду использовать код и терминологию, взятые из Monocle — библиотеки Scala для оптики. Цитата из его документации:

Оптика — это группа чисто функциональных абстракций для управления (получение, установка, изменение и т. д.) неизменяемыми объектами.

Весь иллюстративный код, использованный в этой статье, можно найти в сопроводительном репозитории.

Краткий обзор коротких линз

Если вы знакомы с линзами, вы можете перейти к другим использованиям линз.

Что такое объектив

Объектив по сути представляет собой пару функций:

  • получить(ы:S): A
  • комплект(а: А): S => S

Что такое S и A ? S  представляет Продукт (или, другими словами, «целую часть» или контейнер) и A  некоторый элемент внутри S  (или, другими словами, «конкретную часть»). Следует помнить об этом соглашении об именах , поскольку оно вездесуще в монокле и литературе об объективах. Он будет использоваться в остальной части статьи.

В двух словах: если получить  Линза, можно «увеличить» конкретную часть Продукта , а если установить , можно построить новую «часть целиком» с обновленной «конкретной частью». При увеличении мы теряем часть информации, и поэтому

set нуждается в S в качестве аргумента — чтобы иметь возможность реконструировать весь Продукт.

Очень простой пример с Monocle

Посмотреть код на Gist.

Прежде чем использовать Lens, нам нужно… создать его. С Monocle это сводится к вызову Объектив. Применение метода . Он принимает два аргумента, первый — , функция получения , а второй — , установка функции :

См. код в Gist.

Приведенный выше код содержит все, что вам нужно для создания Lens. Имейте в виду, что не каждая пара функций, созданная с помощью Lens.apply , является настоящей линзой. Такая пара также должна подчиняться законам Линза — так же, как не каждый класс с правильной подписью метода flatMap является законной монадой. Для краткости я не привожу сюда эти законы, их можно найти, например. в scalaz учебник. Мы вернемся к ним в разделе о тестировании.

Давайте посмотрим, что мы можем сделать с nameLens :

Посмотрите код на Gist.

Не очень впечатляюще, но обратите внимание, что на основе этих примитивных операций Объектив определил некоторые другие операции. Примером такой операции является изменить , которая позволяет установить новое значение конкретной детали на основе ее предыдущего значения:

Посмотреть код на Gist.

Вы можете подумать: «Ну и что? Мы можем получать и устанавливать значения case class каким-то новым способом — какой в ​​этом смысл?». Истинное преимущество линз заключается в их компонуемости.

Состав линз – классический пример

Чтобы проиллюстрировать состав линз, я буду использовать классический пример (как, например, в выступлении Илана Годика):

Посмотреть код на Gist.

Полный код для этого примера.

Допустим, имея экземпляр Person , вы хотите преобразовать название улицы в верхний регистр. Самый простой подход очень длинный:

Посмотреть код на Gist.

С линзами тот же код может выглядеть так:

Посмотреть код в Gist.

Как видите, код короче и читабельнее. Как заметил Илан, размер кода увеличивается квадратично при прямолинейном подходе и линейно при использовании линз.

Другой интересный взгляд на линзы состоит в том, что они помогают вам поднимать функции A => A до S => S . В нашем случае мы можем поднять функцию String => String (поскольку название улицы — это String ) до Person => Person :

Посмотреть код в Gist.

Другие варианты использования Lens

В приведенном выше классическом примере хорошо то, что разработчики узнали о Lenses. С другой стороны, могло создаться впечатление, что линзы и оптика в целом — это «просто вещь, которая помогает в доступе к вложенным классам случаев».

Однако истинная сила оптики заключается в том, что их больше и они полностью компонуемые. Но даже с одним объективом вы можете сделать гораздо больше, чем просто получить доступ к вложенным записям. Вы можете использовать их для создания «виртуальных полей», сохранения инвариантов или доступа к битовым полям.

Lens Generation

В случае Lenses, специализирующихся на доступе к полям класса case, их код в большинстве случаев может генерироваться автоматически.

Что такое Prism

Prism по сути представляет собой пару функций:

  • getOption: S => Option[A]
  • reverseGet: A => S

, где S представляет собой сумму (также известную как Coproduct ), а A является конкретной частью Сумма . Основываясь на этих определениях, мы можем видеть, что Prism — это «линза для иерархии признаков». Хотя это явно не истощает суть Prism, и мы выходим за рамки этого, это дает вам хорошую интуицию для начала.

Это также объясняет, почему getOptional Prism (аналог Lens get ) возвращает Option — это потому, что «приближение» к определенному подтипу может завершиться ошибкой. Это явное противопоставление Lens

, получив , который никогда не подведет — Продукт всегда содержит все его части.

Что reverseGet раскрывает о природе Призмы? Это аналог набора Lens : A => S => S 1 , но у него нет S в качестве аргумента. В этом нет необходимости, потому что в случае Prism конкретный случай содержит всю информацию, необходимую для получения более общей суммы .

Простой пример с запечатанной иерархией признаков

Возьмем такую ​​запечатанную иерархию признаков (это способ выразить Sum введите в Scala, полный код):

Посмотреть код на Gist.

Давайте определим Prism[Json, String] :

Посмотрите код на Gist.

Теперь мы можем попробовать примитивные операции:

Посмотреть код на Gist.

Давайте сделаем так, чтобы getOption не работал с вводом не- JStr :

Посмотрите код на Gist.

Хорошо, я признаю, что эти примеры были не очень интересными. Давайте сделаем что-нибудь более полезное с производными комбинаторами. Попробуем переписать такой код:

Посмотреть код на Gist.

Тот же код для Prism:

Посмотреть код на Gist.

Обратите внимание на ясность раскрытия намерения в приведенном выше коде. Также благодаря частичному применению мы можем поднять функцию String => String до Json => Json :

Посмотреть код на Gist.

изменить выводит на поверхность другой вопрос — что, если Json на входе не «фокусируется» данной Prism? Попробуем:

Посмотреть код в Gist.

Как видите, мы вернули исходное значение. В некоторых случаях это может быть нормально, но если вам нужна информация об успешности операции, вам нужно вместо этого использовать modifyOption :

Посмотреть код на Gist.

Генерация призм

Призмы также могут быть созданы для простых случаев.

Prism как безопасное приведение вниз

В этом разделе мы попытаемся написать код доступа и модификации для работы с String как Междунар. . Поскольку обработка String как Int (например, с String.toInt ) может привести к ошибке, это кажется хорошим вариантом использования Prism. Начнем с определения Prism[String, Int] (полный код):

Посмотрите код на Gist.

Это незаконная Prism, но давайте на время проигнорируем ее (мы вернемся к этому в разделе тестирования).

Посмотреть код на Gist.

Мы также можем поднимать функции Int => Int to String => String :

Посмотреть код на Gist.

Состав призмы

В качестве примера в этом разделе мы будем использовать другой класс случая – Процент . Он использует Int из диапазона 0-100 включительно в качестве внутреннего представления. Он определяется следующим образом:

Посмотреть код на Gist.

Учитывая метод Percent.fromInt , его легко реализовать Prism[Int, Percent] :

Посмотреть код на Gist.

Допустим, мы хотим определить Призма[Строка, Проценты] . Поскольку Prism можно компоновать, мы можем сделать это, просто составив Prism[String, Int] и Prism[Int, Percent] :

Посмотрите код на Gist.

Вас может удивить PPrism — о нем позже. На данный момент все, что вам нужно знать, это то, что тип stringToPercent является точным эквивалентом Prism[String, Percent] .

Вот как ведет себя составленная призма:

Посмотреть код в Gist.

Проверка призм (и оптики в целом)

Помните, я говорил, что наша призма незаконна. В этом разделе это объясняется более подробно.

Точно так же, как мы определяем конкретные экземпляры большинства функциональных абстракций (например, Monads), мы создаем экземпляры Prisms (и другой Optics) следующим образом:

  • реализуя методы, необходимые для API
  • обеспечение соблюдения законов

Первый вариант прост, так как компилятор проверяет, соответствуют ли подписи API. Однако компилятор не может проверить, соблюдаются ли законы. Поэтому нам нужно позаботиться об этом, написав соответствующие тесты.

Чтобы убедиться, что созданная призма следует законам призмы, мы будем использовать закон монокля . Это дополнительный артефакт, опубликованный в рамках проекта монокль . Он построен на основе scalacheck и дисциплины Typelevel и содержит определения всех законов оптики. monocle-law использует подход к тестированию, основанный на свойствах.

В этом подходе вы определяете, какие свойства должны содержаться в вашем коде, а затем эти свойства проверяются на случайно сгенерированные значения. В случае тестирования Оптики Монокля мы будем использовать законы Оптики в качестве утверждений. Поэтому нам просто нужно позаботиться о генерации входных значений.

Чтобы быть более конкретным, мы увидим, как реализовать тесты для наших призм:

Посмотрите код на Gist.

Как видите, на высоком уровне это выглядит очень лаконично. PrismsTests определяется монокль-законом и отвечает за создание работоспособной проверки законов Prism для данной Prism. Затем мы запускаем его с checkLaws . Вы можете задаться вопросом, где генерируется часть. В этом отношении полезно взглянуть на PrismTests.apply 9.0206 сигнатура метода:

Посмотреть код на Gist.

В нем говорится, что компилятору требуется неявный экземпляр Произвольный и Равный как для A , так и для S . Arbitrary[S] отвечает за генерацию возможных значений S , а Equal

— это класс типов scalaz для проверки равенства. Для нас более интересен Произвольный . В Scalacheck есть экземпляры Произвольные для базовых типов и есть подходящие значения по умолчанию для Int и String .

Однако, поскольку экземпляры String , сгенерированные генератором по умолчанию, абсолютно случайны, мы создадим собственный генератор. Вместо полностью рандомизированных строк мы хотели бы иметь в основном входные данные, похожие на числовые значения, с некоторым добавлением различных значений. Вы можете взглянуть на ArbitraryInstances, чтобы увидеть, как мы определяем Arbitrary для String и Percent .

Когда я запустил этот тест, я увидел:

Посмотреть код на Gist.

Теперь мы видим, что, как упоминалось ранее, наш stringToIntPrism не является законным Prism.

В этом случае довольно легко понять, что не так — stringToIntPrism не сохраняет некоторые значения во время кругового пути. Чтобы быть более конкретным:

Посмотрите код на Gist.

Законы призмы гласят, что ожидаемый результат должен быть «005». Мы можем решить эту проблему, ограничив допустимые входы String . Мы можем сделать это следующим образом:

Посмотреть код на Gist.

Сейчас тесты проходят.

Определения законов, аналогичные PrismTests , существуют для всей оптики (например, для линз). Как вы видели, тестирование на соответствие этим законам довольно простое и очень полезное средство для раннего выявления неправомерного поведения.

Iso

Вы можете думать об Iso как о чем-то, что одновременно является Линзой и Призмой. Это означает, что навигация с S и A всегда успешна (как и в Lens), а навигация с

A в S не требует никакой дополнительной информации, кроме значения A (как в Prism) – другими словами преобразование из S в A происходит без потерь. Как вы, вероятно, уже заключили, это хорошо соответствует математической концепции изоморфизма.

Поэтому примитивные операции для Iso симметричны:

  • get: S => A
  • reverseGet: A => S

Когда полезно использовать Iso? Практически в любое время при представлении одних и тех же данных разными способами. Один из классических примеров — работа с физическими единицами. Допустим, у нас есть два класса:

Посмотрите код на Gist.

Мы можем создать Iso и использовать его:

Посмотреть код на Gist.

Необязательный

Вы можете думать о Необязательный как о чем-то более общем, чем Призма и Линза. Как и в случае с Prism, элемент

A , который мы пытаемся сфокусировать, может не существовать. В то же время фокусировка тоже с потерями — после фокусировки у нас недостаточно информации, чтобы вернуться на S без дополнительных аргументов. Это примитивные операции для Необязательно:

  • getOption: S => Option[A]
  • комплект: A => S => S

Допустим, мы работаем со следующей иерархией классов (полный код):

Посмотреть код на Gist.

Рассмотрим Optional[Error, String] , что позволило бы нам «приблизиться» к detailMessage . Это не может быть Lens[Error, String] как ErrorB не содержит detailMessage . Вот почему нам нужен

Необязательный — он явно говорит нам, что операция может завершиться неудачно.

Такой Необязательный можно реализовать следующим образом:

Посмотреть код на Gist.

Довольно редко можно увидеть Дополнительный , реализованный непосредственно, как указано выше. Вместо этого обычно вы используете отдельные Prism и Lens , а затем компонуете их вместе. Он будет обсуждаться более подробно позже.

Иерархия Оптики

Мы познакомились с 4 типами Оптики. Как они связаны друг с другом, показано на следующей диаграмме:

Эта диаграмма предназначена для чтения как диаграмма иерархии классов UML, поэтому, например. стрелка, идущая от объектива к опциональному, означает, что объектив является частным случаем опционального. И что это значит, что и Lens, и Prism можно рассматривать как опциональные? Объектив является необязательным, для которого getOption всегда выполняется успешно. Призма это Необязательный , для которого мы игнорируем S («целая часть») – A («конкретная часть») содержит всю информацию для создания нового S .

Это не полный список оптики. Состав различных типов оптики

Состав различных типов оптики делает их особенно привлекательными. Это позволяет вам легко получать доступ и преобразовывать данные между различными представлениями. Прелесть заключается в том, что вам нужно определить только небольшую часть оптики — остальные вы можете создать, просто составив существующую оптику.

Простой пример

В одном из предыдущих примеров у нас был примерно такой код:

Посмотреть код на Gist.

Мы обращаемся к m.whole только для того, чтобы обновить его и вернуть в класс case, используя копию . Звучит как работа для Lens. Кроме того, вместо использования Centimeter в качестве ввода и вывода мы можем использовать String вместе с Prism[String, Centimeter] . Последнее может быть не очень хорошей идеей в целом, но в тестовом коде имеет смысл стремиться к короткому и читабельному коду. Имея надлежащую оптику, составить их — это вопрос:

Посмотреть код на Gist.

Результат составления Prism, Iso и Lens является необязательным. Это имеет смысл, так как это ближайший общий предок типов, составленных в иерархии Optics. Результирующий stringToWholeMeter можно использовать следующим образом:

Посмотреть код на Gist.

Следующая диаграмма представляет собой попытку визуализировать этот поток:

Пример из реального мира: circe-optics

circe-optics — отличное практическое применение идеи оптики. Когда вы немного подумаете о просмотре и изменении документов JSON, вам может показаться, что у Optics есть довольно много общих аспектов.

Поле с данным именем может существовать, а может и не существовать — звучит как Призма, мы можем с потерями сфокусироваться на каком-то поле, а понятие вложенности — звучит как Линза, тогда нам нужно «предположить», что какое-то поле, например. String — снова звук Prism. Давайте очень кратко рассмотрим реализацию Circe-Optics .

Он определяет призмы для всех типов JSON, например:

Посмотреть код на Gist.

Так как jsonNumber в свою очередь Prism[Json, JsonNumber] это отличный пример композиции однотипной оптики. Кроме того, библиотека во многих местах использует композицию разных типов. Хорошим примером может быть «углубление» в структуру JSON. Вы можете получить доступ к {order: {address: {...} }} в виде javascript:

Посмотреть код на Gist.

Хороший «точечный синтаксис» реализован в Dynamic (упомянутый в нашем блоге). Dynamic отправляет средства доступа, подобные полям, в метод selectDynamic , который делает следующее:

Просмотрите код в Gist.

Как мы видим, он составляет jsonObject Prism с индексом Необязательный. Наша интуиция подсказывает, что это имеет смысл, потому что, прежде чем углубляться в желаемое поле , нам нужно «предполагать» с помощью Prism, что текущее поле является объектом JSON.

В общем, мы получили кучу сборной оптики — что мы можем с ними сделать? Допустим, мы хотим изменить строковое поле в некотором вложенном JSON. Решение без оптики может выглядеть следующим образом (полный код):

Посмотреть код на Gist.

Сравним с оптическим эквивалентом:

Посмотреть код на Gist.

Разница в простоте и лаконичности бросается в глаза.

Очень грубое знакомство с внутренностями оптика-круг . Я призываю вас изучить исходный код — это действительно элегантное решение практической проблемы. Также кодовая база для оптики относительно невелика и содержит хорошие тесты.

Полиморфные линзы

Я должен объяснить вам ППризма . Играя с Monocle, вы быстро столкнетесь с типами P с префиксом, такими как PPrism , POptional и PLens . Во всех этих случаях P означает полиморфный. Что подразумевается под полиморфностью некоторого Optic? Вы, наверное, заметили, что все Линзы имеют пару функций на типах S и A . Когда Optic является полиморфным, для «обратной» операции в игру вступают дополнительные два типа: B для аргумента и T за результат этой операции.

Возможно, вам будет легче понять эту идею, взглянув на определение PLens :

См. код в Gist.

Резюме

  • Монокль дает нам весь спектр оптики. В этой статье описывается только часть из них
  • Всякий раз, когда вам трудно просматривать или изменять глубоко вложенные или рекурсивные структуры данных, это признак того, что оптика может помочь
  • Когда вам нужно работать с разными представлениями практически одних и тех же данных, это также сигнал о том, что оптика может быть полезна. Это означает, что весь код (де)-сериализации является хорошим кандидатом для Optics 9.02:30
  • Чтобы получить все преимущества оптики, они должны быть законными
  • Всегда проверяйте свои экземпляры Оптики на соответствие их законам. монокль-закон - это путь в монокле

Ссылки

Первые две ссылки послужили источником вдохновения для меня при написании этой статьи. Я рекомендую посмотреть их оба, чтобы понять суть оптики. Если вы найдете их достаточно интересными, чтобы погрузиться еще глубже, вам следует изучить дополнительные ссылки.

Talks

  • Доклад Илана Годика — отличный вводный доклад об оптике в Scala с использованием Monocle, подготовленный одним из сопровождающих. Короткий и не требует никаких специальных знаний заранее. Также представляет линзы Van Laarhoven 9.02:30
  • Доклад Жюльена Трюффо. Жюльен является автором книги «Монокль», в этом выступлении он дает отличный обзор и интуицию о различных типах оптики
  • еще одно выступление Жюльена Трюффо – на этот раз о JsonPath – концепция уже упоминалась в этой статье в разделе, посвященном
    цирковой оптике
  • Доклад Брайана Маккенны. Брайан просматривает библиотеки Optics на нескольких разных языках: PureScript, Haskell, Scala и Java. Упоминает хорошие примеры приложений, включая представление веб-страниц в виде оптики, которая позволяет перемещаться между состоянием и пользовательским интерфейсом в Halogen, работу с записями Kinesis в Haskell, обработку ошибок с помощью Prisms в Scala 9.02:30
  • Доклад Саймона Пейтона Джонса — общий обзор линз в Haskell
  • Курс Бартоша Милевского, часть 1 и часть 2 – Бартош объясняет линзы с точки зрения теории категорий

Другие ресурсы

  • Сопутствующий репозиторий с кодом, обсуждаемым в этой статье
  • Список ссылок из документации Monocle
  • Страница упражнений Scala
  • Очки
  • — новинка в блоке Scala Optics
  • отличная подборка различных видов оптики от Олега Гренруса. Haskell используется для объяснений 902:30 Объектив
  • за чаем — цикл статей об оптике и её реализации в Haskell

моноклей - нпм

(Адаптировано с сайта monocle)

Изменение неизменяемого вложенного объекта в JavaScript требует многословия, что затрудняет понимание и анализ кода.

Рассмотрим несколько примеров:

 interface Street {
  номер: номер
  имя: строка
}
адрес интерфейса {
  город: строка
  улица: улица
}
интерфейс Компания {
  имя: строка
  адрес: Адрес
}
интерфейс Сотрудник {
  имя: строка
  компания: Компания
} 

Допустим, у нас есть сотрудник, и нам нужно перевести в верхний регистр первую букву названия улицы его компании. Вот как мы можно написать на ванильном JavaScript

 const employee: Employee = {
  имя: 'Джон',
  Компания: {
    название: 'крутая компания',
    адрес: {
      город: Лондон,
      улица: {
        число: 23,
        Название: 'Главная улица'
      }
    }
  }
}
const capitalize = (s: string): string => s. substring(0, 1).toUpperCase() + s.substring(1)
const employeeCapitalized = {
  ...работник,
  Компания: {
    ...сотрудник.компания,
    адрес: {
      ...сотрудник.компания.адрес,
      улица: {
        ...сотрудник.компания.адрес.улица,
        имя: использовать заглавные буквы (сотрудник.компания.адрес.улица.имя)
      }
    }
  }
} 

Как мы видим, копировать неудобно для обновления вложенных объектов, потому что нам нужно повторяться. Посмотрим, что может мы делаем с моноклями

 импорт {объектив} из 'монокль-тс'
const company = Lens.fromProp()('company')
постоянный адрес = Lens.fromProp()('address')
const street = Lens.fromProp
()('street') const name = Lens.fromProp()('name')

compose принимает две линзы , одну из A до B и еще один от B до C и создает третью линзу от A до С . Следовательно, после составления компания , адрес , улица и имя , получаем Объектив от Сотрудник до строка (название улицы). Теперь мы можем использовать этот объектив , полученный из композиции, чтобы изменить название улицы с помощью функция заглавные буквы

 const capitalizeName = company.compose(адрес).compose(street).compose(name).modify(capitalize)
assert.deepStrictEqual(capitalizeName(employee), employeeCapitalized) 

Вы можете использовать API fromPath , чтобы избежать некоторых шаблонов

 import { Lens } from 'monocle-ts'
const name = Lens.fromPath()(['компания', 'адрес', 'улица', 'имя'])
const capitalizeName = name.modify (с заглавной буквы)
assert.deepStrictEqual(capitalizeName(employee), employeeCapitalized) // true 

Здесь изменить поднять строку функции => строка до функции Сотрудник => Сотрудник . Работает, но было бы понятнее если бы мы могли увеличить первый символ строки с помощью линзы . Однако мы не можем написать такой Объектив , потому что Линзы требуют, чтобы поле, на которое они направлены, было обязательным . В нашем случае первый символ строки — это необязательно как строка может быть пустым. Итак, нам нужна еще одна абстракция, которая была бы своего рода частичной Линзой, т.е. монокль-ц называется Дополнительный .

 import {Необязательный} из 'monocle-ts'
импортировать {some, none} из 'fp-ts/Option'
const firstLetterOptional = новый необязательный <строка, строка>(
  (s) => (s.length > 0? некоторые (s[0]): нет),
  (a) => (s) => (s.length > 0 ? a + s.substring(1): s)
)
const firstLetter = company.compose(адрес).compose(улица).compose(имя).asOptional().compose(firstLetterOptional)
assert.deepStrictEqual(firstLetter.modify((s) => s. toUpperCase())(employee), employeeCapitalized) 

Аналогично в составе для объективов, в составе для опций требуется два Доп. B в C и создает третий Дополнительный из A в C . Все линзы можно рассматривать как Дополнительные устройства , где дополнительные элемент для увеличения всегда присутствует, поэтому при составлении Дополнительного и Объектива всегда получается Дополнительный .

Стабильная версия протестирована на TypeScript 3.5.2, но должна работать и с TypeScript 2.8.0+

монокль-тс версия требуется машинопись версия
2.0.х+ 3,5+
1.х+ 2.8.0+

Примечание . Если вы используете < typescript@3. 0.1 , вам нужно полифилл неизвестно .

Вы можете использовать unknown-ts в качестве полифилла.

  • Справочник API

Экспериментальные модули (*) публикуются для того, чтобы получить ранние отзывы от сообщества.

Экспериментальные модули независимы и обратно несовместимы со стабильными.

(*) Функция, помеченная как Experimental , находится в постоянном движении, вы рискуете изменить ее без предварительного уведомления.

От монокль@2.3+ можно использовать следующие экспериментальные модули:

  • Iso
  • Линза
  • Призма
  • Дополнительно
  • Траверса
  • В
  • IX

, которые реализуют те же функции, что и в index.ts , но основаны на pipe , а не на class .

Вот те же примеры с новым API

 Интерфейс Улица {
 номер: номер
 имя: строка
}
адрес интерфейса {
 город: строка
 улица: улица
}
интерфейс Компания {
 имя: строка
 адрес: Адрес
}
интерфейс Сотрудник {
 имя: строка
 компания: Компания
}
постоянный сотрудник: Сотрудник = {
 имя: 'Джон',
 Компания: {
 название: 'крутая компания',
 адрес: {
 город: Лондон,
 улица: {
 число: 23,
 Название: 'Главная улица'
 }
 }
 }
}
const capitalize = (s: string): string => s.substring(0, 1).toUpperCase() + s.substring(1)
const employeeCapitalized = {
 ...работник,
 Компания: {
 ...сотрудник.компания,
 адрес: {
 ...сотрудник.компания.адрес,
 улица: {
 ...сотрудник.компания.адрес.улица,
 имя: использовать заглавные буквы (сотрудник.компания.адрес.улица.имя)
 }
 }
 }
}
импортировать * как утверждение из «утверждать»
импортировать * как L из 'monocle-ts/Lens'
импортировать {pipe} из 'fp-ts/function'
const CapitalizeName = канал (
 L.
Монокль объектив: Доступ ограничен: проблема с IP

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх