• Как умные контракты изменят нашу жизнь
    0

    Погуглите по ключевым словам "zero knowledge proof", это решает поднятую вами проблему и уже сейчас имплементировано в криптовалюте zCash.

  • Доктор Мошенник: взлёт и падение знаменитого учёного, обманувшего почти всех
    +2
    Для начала вам придётся провести кучу исследований сначала на животных, а затем — через несколько лет (как минимум) после этого — на людях. А потом подождать ещё несколько лет (как минимум) — и получить разрешение властей на использование вашего материала. И вот тогда вы сможете его монетизировать.

    Медицина — это крайне зарегулированная (и обоснованно зарегулированная) сфера деятельности. Прежде, чем внедрять ваш материал в организм человека, вам придётся доказать как минимум отсутствие от него вреда здоровью животных, беременных животных, затем экспериментальных пациентов, беременных экспериментальных пациентов, экспериментальных пациентов в пожилом возрасте, экспериментальных пациентов юного возраста, отсутствие нежелательных реакций в сочетании с антибиотиками, пищевыми продуктами и т.д.
  • Снижение беспошлинного порога до 20 евро – уже в проекте федерального бюджета на 2018-2020 гг
    +2
    Я живу в Европе (Италия). Заказы делаем в подавляющем большинстве случаев в европейских магазинах (на Амазоне, конечно, чаще всего). Покупаем онлайн почти все непродовольственные и нехозяйственные (типа стирального порошка, туалетной бумаги и т.д.) товары — от столов и стульев до одежды, электроники и школьных рюкзаков для детей. Если магазин итальянский — привозят в срок до 3 дней, если, скажем, немецкий — бывает и неделя. Блендер Мулинекс, заказанный из Амазона, прислали из Франции. Зарядку для макбука, производимую американской компанией в Калифорнии, эта американская компания прислала со своего европейского склада (кажется, из UK, но точно не помню). Поскольку европейский рынок большой, многие производители держат склад в какой-то из европейских стран, чтобы покупатели не заморачивались с расчётом пошлин и была более оперативной доставка.

    Один раз жена заказывала косметику в американском интернет-магазине — долларов на 60. Приехал, как обычно почтальон, к двери подъезда, я спустился с карточкой, оплатил через его мобильный терминал пошлину, и он отдал мне посылку.

    На Алиэкспрессе заказывал 2 раза: трипод с гнущимися ножками для съемки с телефона и новый чехол для своего макбука. Оба раза сумма была меньше 22 евро, поэтому просто получил посылку как обычно и всё. Доставка, правда, слишком долгая — 40-50 дней ждать. Пару раз думал заказать на Алиэкспрессе что-то ещё, но потом заходил на Амазон, и оказывалось, что там китайцы продают то же самое по тем же самым ценам (что меня удивило — но факт есть факт). При этом и доставка гораздо оперативнее.

    Так что не надо сравнивать Россию с Европой. Во-первых, Европа огромная, внутри ЕС торговля беспошлинная, а Германию и Францию, как производителей товаров, не сравнить с Беларусью и Казахстаном. Во-вторых, очень многие производители не из стран ЕС имеют склад в одной из европейских стран, т.к. рынок огромный, конкуренция большая, и они так увеличивают свою конкурентоспособность. Ну, а в-третьих, даже когда надо заплатить пошлину, это отнимает, конечно, деньги, но не приносит никакого дополнительного геморроя — просто платишь наличными или с карточки почтальону, который принёс посылку, и всё.
  • Теорема Байеса: из-за чего весь сыр-бор?
    0
    Закончим подсчёты. Чтобы получить P(E), сложим истинные и ложные срабатывания, получим 0,0198, поделим на это 0,0099, и получим 0,5.


    Если вы поделите 0,0198 на 0,0099, то получится 2, а не 0,5. Здесь аргументы перепутаны местами.
  • Жаргон функционального программирования
    +2

    Конечно можно придумать обобщение, не зная концепции. Можно и все алгоритмы самому придумать. Но обычно умные люди изучают то, что уже придумали другие люди, чтобы не изобретать велосипед. Это просто эффективнее. А придуманным алгоритмам и концепциям обычно дают имя, чтобы можно было быстро сказать собеседнику, о чём вы говорите, так, чтобы он понял, о чём идёт речь.

  • Жаргон функционального программирования
    +4

    Термины программировать не помогают, а вот концепции, которые называются этими терминами — очень даже.


    Возьмём функтор. Например, есть значение какого-то типа, обёрнутое в какой-то другой тип (Optional, List, Array… — во что угодно). И у вас уже есть функция fun1, которую можно применить к тому типу данных, который находится внутри обёртки (назовём этот тип Int). Но эту функцию нельзя применить к типу Int, который находится в обёртке (скажем, эта обёртка Optional). А вам это нужно. И вот вы пишете функцию fun1Optional. Можете вы её написать, не зная термина "функтор"? Какие проблемы — конечно можете!


    Но тут у вас возникает задача сделать так, чтобы функция fun2, работающая со значениями типа Int, тоже могла работать со значениями Optional Int. И чтобы функция fun3 тоже так могла работать. И fun15. И вот вы пишете функции fun2Optional, fun3Optionalfun15Optional… Можете? Конечно, почему нет? Не зная ни о какой концепции, называемой термином "функтор".


    Но если вы знаете о такой концепции, то вместо того, чтобы переписывать вручную кучу функций, работающих с типом Int, чтобы они работали с типом Optional Int, вы просто делаете обёрточный тип Optional функтором, определяя для него всего одну функцию map (или fmap — это одно и то же), которая принимает в качестве первого аргумента функцию, работающую с типом Int, в качестве второго аргумента — значение Optional Int, и применяет эту функцию Int -> ВоЧтоТоЕщё (которая уже имеется у вас!) к значению типа Int внутри обёрточного типа Optional. В результате вам не надо писать кучу функций fun1Optionalfun15Optional, а достаточно написать одну единственную функцию fmap для обёрточного типа Optional. И наличие у обёрточного типа Optional функции fmap делает его функтором.


    Более того: наличие функции fmap позволяет вам использовать уже имеющиеся у вас функции не только со значениями типа Optional Int, но и с Optional Float, и с Optional String, и с Optional Bool — и т.д. Просто потому, что вы сделали обёрточный тип Optional функтором — путём определения для него всего одной функции.


    Можно ли программировать без знания концепции функтора? Конечно можно! Просто у вас будет меньше code reuse, больше определений новых функций, а ваш код будет сложнее читаться, рефакториться и дебажиться. Помогает ли знание концепции "функтор" программировать? По-моему, да.

  • Как попасть на работу в международную ИТ-компанию?
    +1
    Было бы гораздо полезнее, если бы non profit организации выкладывали ТЗ на те задачи, что им требуется сделать (разбивая их на относительно небольшие), а компании выбирали бы оттуда тестовые задания для соискателей. И некоммерческим организациям хорошо, и соискатель чувствует, что благое дело делает, а не пишет что-то бесплатно для потенциального работодателя, и работодатель видит навыки соискателя. И даже портфольо у соискателя формируется без публикации кода — в виде реально выполненного проекта.
  • Новая редакция популярного бесплатного учебника электроники, архитектуры компьютера и низкоуровневого программирования
    0
    А с каких пор Киевский национальный университет стал «ведущим российским ВУЗом»?
  • Эффект Доплера помог физику из Казани успешно оспорить штраф ГИБДД
    +1
    The Proof of Innocence

    Dmitri Krioukov

    A way to fight your traffic tickets. The paper was awarded a special prize of $400 that the author did not have to pay to the state of California.
    In view of enormous, extremely surprising and completely unexpected public interest to this work, we have added an appendix answering the two most common questions.
  • Программисты на C — самый большой разделённый народ в мире?
    0
    С чего вы взяли, что я (автор этой заметки) — редактор Хабра? Я такой же пользователь, как и вы. И в заметке приведены все необходимые ссылки для того, чтобы можно было узнать продолжение непосредственно у первоисточника, если это интересно.
  • Программисты на C — самый большой разделённый народ в мире?
  • Программисты на C — самый большой разделённый народ в мире?
    +3
    Вы можете быть татарином и не зная татарского языка.

    Вообще, в современном мире национальность определяется самоидентификацией. Вы сами должны определиться (если хотите), кто вы больше — русский или сишник.

    При переписи населения вас просто попросят указать, кто вы по национальности, не вдаваясь в подробности национальностей бабушек или дедушек, а если вы не захотите говорить переписчику свою национальность, настаивать не имеют права.
  • Программисты на C — самый большой разделённый народ в мире?
    +6
    «Этничность можно представить как форму общественной организации культурных различий, состоящей из тех характеристик, которые сами члены этнической общности считают для себя значимыми и которые лежат в основе их самосознания. К этим характеристикам относится также обладание одним или несколькими общими названиями, общие элементы культуры, представление об общем происхождении и, как следствие, наличие общей исторической памяти.…

    Определение этничности строится также на основе культурной самоидентификации этнической общности по отношению к другим общностям (этническим, общественным, политическим), с которыми она находится в фундаментальных связях.» https://ru.wikipedia.org/wiki/Этнос

    «Этнос — исторически сложившаяся этническая общность — племя, народность, нация.

    Нация — исторически сложившаяся устойчивая общность людей, образующихся в процессе формирования общности их территории, экономических связей, литературного языка, особенностей культуры и духовного облика.» С. И. Ожегов
  • Security Week 04: дыра в WiFi софте Lenovo, конф-колл-бэкдор, Amazon раздает HTTPS бесплатно
    0
    В «Voyage de condom» презерватив никак не мог достигнуть океана, т.к. Каспийское море, в которое впадает Волга — это озеро, не соединённое с океанами.
  • Комментарий к «Как попасть на дачу президента в пять часов утра»
    +3
    Про то, как сертифицируют, я помолчу. Достаточно знать, как стандарты разрабатываются, по которым потом сертификация происходит.
  • «Страшные» абстракции Haskell без математики и без кода (почти). Часть I
    +1
    Планирую выделить время на продолжение после НГ.
  • «Страшные» абстракции Haskell без математики и без кода (почти). Часть I
    0
    Не уверен, о чём именно вы говорите, но, мне кажется, вы описываете монадные трансформеры. Они позволяют оборачивать вычисления сразу в несколько монадных обёрток одновременно.
  • «Страшные» абстракции Haskell без математики и без кода (почти). Часть I
    0
    На большее количество картинок меня не хватило, увы. Но я бы посоветовал вам после прочтения этой статьи посмотреть вот эту презентацию: там картинок больше, и они, как говорится, в тему. Может, это позволит вам лучше понять хаскельные абстракции.
  • Почему наши высокоуровневые языки до сих пор не такие уж и высокоуровневые?
    +3
    Но при этом вы очень удивите людей, живущих вне экс-СССР, когда захотите выйти из лифта на первом, а не на нулевом этаже.
  • Почему наши высокоуровневые языки до сих пор не такие уж и высокоуровневые?
    0
    Почему индексация начинается с нуля? Потому что именно 0 это точка отсчёта, а не 1. Когда у вас будут детки, и вы будете учить их считать, используя числовую шкалу, вы поймёте, почему индексация начинается с нуля. Когда ваши детки будут ставить карандаш на единицу, чтобы от неё отсчитывать нужное количество чисел, а вы будете сдвигать его на 0, объясняя, что именно оттуда всё начинается, вы поймёте это очень хорошо ;)).
  • «Страшные» абстракции Haskell без математики и без кода (почти). Часть I
    +4
    В статье немало неполных ответов и сознательных упрощений. Если бы не они, получилось бы не статья, а книга, которая никогда бы не вышла по причине нехватки времени на её написание ;)). Я и так эту статью несколько месяцев рожал, пока, наконец, не собрался, и не дописал, выделив на это пару дней практически целиком.
  • «Страшные» абстракции Haskell без математики и без кода (почти). Часть I
    +1
    Практическое применение простое, и в основном люди как раз жалуются, что они применяют монады, но не понимают их. Если очень кратко, то все монады можно условно разделить на 2 части.

    Первая часть в качестве «чего-то ещё» содержит некоторый маркер, относящийся к «основным» вычислениям — он говорит на об успешности или неуспешности вычислений, о наличии или отсутствии ошибок в вычислении, о том, что у нас может быть 0 результатов или же очень много результатов. Т.е. в этих монадах мы не манипулируем с «чем-то ещё», а просто «смотрим» на него и, в зависимости от его значения, применяем одно или другое уравнение, описываемое оператором (>>=). Мы просто пишем код, как будто вычисления успешны (или у нас более нуля результатов вычислений), а неуспешные случаи вычислений обрабатываются автоматически. Грубо говоря, эти монады позволяют нам не писать кучу вложенных if then else и ручных манипуляций с разветвляющимися вычислениями.

    Вторая часть предполагает «более материальное» «что-то ещё», которым мы можем манипулировать напрямую. У всех таких монад есть функции типа get и put (а также выводимая из этих функций функция modify). В разных монадах они могут называться по-разному, но суть их одна и та же: вы можете получить текущее значение внешнего окружения (состояния), произвести с ним какие-то манипуляции и заменить текущее значение новым его. В монаде IO, правда, функции get и put размножились, потому что мы можем хотеть получить строку или символ, хэндл, название директории и т.д., но суть их точно такая же. А работа с этими монадами заключается в реализации нужного вам алгоритма в do-блоке, в котором вы композируете эти функции и функции, работающие со значениями ваших основных вычислений, так, как вам нужно.

    Что касается чистых функций, то вы их просто применяете внутри do-блока к значениям состояния и «основных» вычислений, которые вы «вытащили» из обёртки. Они производят вычисления, а затем возвращают результат обратно в вашу обёртку (в do-блок, откуда пришли их аргументы).
  • «Страшные» абстракции Haskell без математики и без кода (почти). Часть I
    0
    Возьмём вот эту строчку, и представим, что x у нас является выражением типа (2 + 3) * 5:

    result1 x = (factorial x) * (factorial (x - 1)) * x
    

    У нас все переменные x будут ссылаться на thunk, содержащий это невычисленное выражение. Вычислено оно будет тогда, когда понадобится один из этих x. Как только один из иксов понадобится, выражение (2 + 3) * 5 будет заменено в памяти на 25. А поскольку на этот участок памяти ссылаются все иксы, то они автоматически будут ссылаться уже на 25.

    P.S.: факториал понятнее и эффективнее выражается следующим уравнением: fac n = product [1..n] :)
  • «Страшные» абстракции Haskell без математики и без кода (почти). Часть I
    0
    В этой статье описываются дополнительные способы мемоизации. А вообще, когда вы в каком-то выражении используете «переменную», то она, благодаря ленивой природе языка, не вычисляется сразу, а сохраняется в виде так называемого thunk (отложенное вычисление). А переменная содержит ссылку на этот thunk. Другие переменные с тем же именем, содержат ссылку не на свой отдельный thunk, а на тот же. Когда thunk вычисляется, он заменяется вычисленным значением. А значит, другие переменные, ссылающиеся на него же, не должны вычислять его снова, а берут уже вычисленное значение.
  • Проблемы, вызванные определением кортежей как функторов
    0
    Вы забываете о том, что у вас в кортеже могут быть значения совершенно разных типов. Давайте попробуем представить, что компилятор позволил вам реализовать fmap для тройки так, как вы хотите, и попробуем применить fmap (+1) к тройке:

    fmap (+1) (True, "string", 2) == (True + 1, "string" + 1, 2 + 1)
    

    Какой результат вы хотели бы получить в этом случае?

    Теперь понятно, почему функтором можно сделать только однопараметрический тип (или многопараметрические, но частично применённые до однопараметрического)?

    Если бы кортежи могли содержать значения только одного типа, то у вас всё бы получилось.
  • Высосанные из пальца стартапы, которые ничего не решают
    0
    Высокомотивированный человек сможет обучиться и по скучно написанным книжкам, я согласен. Но в игровой (или, скажем шире — в развлекательной) форме обучение привлекательно и доступно для гораздо большего количества людей. Мой шестилетний сын, который учится в первом классе, с большой неохотой садится за домашние задания, в том числе по математике. Но при этом он всего за час в игровой форме научился преобразовывать числа из десятичной системы исчисления в двоичную и наоборот (по методике Я. И. Абрамсона) — и делает это с удовольствием, так как мы «не занимаемся скукотенью», а играем в кубики.

    Edutainment — это то направление, в котором обязательно будет прорыв, и в котором те, кто найдут работающие механизмы, заработают много денег. Даже если человек высокомотивирован и может научиться по скучным книжкам и разбираясь в чужих проектах, он, при прочих равных, выберет более увлекательный и захватывающий способ получения знаний.
  • Высосанные из пальца стартапы, которые ничего не решают
    +2
    Это ваше мнение, и не следует его считать оценкой продукта рынком. Я знаю множество не начинающих девелоперов, которых эта игра захватывает, и которые улучшают свой код, пытаясь написать более элегантное и эффективное решение, сравнивая его затем с кодом, написанным другими игроками. У проекта есть многочисленная аудитория — это факт, и данный факт говорит о том, что он нужен людям. И даже если принять ваше мнение по поводу того, что этот проект не развивает навыки, необходимые программисту (с чем я не согласен), то бизнесом называется не то, что обязательно полезно, а то, что востребовано (а это уже можно пытаться монетизировать). Angry Birds, например, заставляют только бесполезно тратить время, но от этого бизнес компании Rovio не перестает быть бизнесом.
  • Высосанные из пальца стартапы, которые ничего не решают
    +2
    Check.io — офигенный стартап. И по моему мнению, и по мнению инкубатора Techstars, из которого он выпустился, и по мнению Гвидо ван Россума, который к нему присоединился, и по мнению множества крупных и известных компаний, которые сделали в этой программистской игре свои острова. Это — будущее онлайн-образования.
  • Если вы решили перейти с PHP на Python, то к чему следует подготовиться
    +1
    Haskell:

    [2,4..10]
    

    Или, если последовательность более сложная — например, числа от 1 до 100, кратные 3 и 5 одновременно — то на Haskell это выглядит так:

    [x | x <- [1..100], x `mod` 3 == 0, x `mod` 5 == 0]
    
  • Ликбез по типизации в языках программирования
    0
    Примечание: я намерено использовал некаррированную функцию, а также намерено записал частную сигнатуру вместо более общей add :: (Num a) => a -> a -> a*, т.к. хотел показать идею, без объяснения синтаксиса Haskell'а.

    Если вы используете кортеж, то сигнатура функции будет:

    add :: (Num a) => (a, a) -> a
    
  • Дискретные структуры: матан для айтишников
    0
    Рекурсивное, однако весьма эффективное определение последовательности чисел Фибоначчи. Функция высшего порядка zipWith берет два списка и применяет к их элементам с одинаковыми указанную функцию (в данном случае — функцию сложения):

    fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
    
  • Пора заменить Python как язык для обучения
    0
    Если пытаться прогнозировать будущее, то лучше всего смотреть на то, что и как делают дети и подростки. Так вот: если посмотреть, что и как они делают, то можно увидеть, что они в качестве основной используют мобильные платформы (подростки — в основном телефоны, а детки помладше — в основном планшеты), а на них — нативные, а не браузерные, приложения. Это наблюдение подтверждается в том числе теми моими знакомыми, которые развивают детские ресурсы — все они сейчас озабочены тем, как их устоявшуюся бизнес-модель перенести в мир нативных приложений на мобильных устройствах.
  • Категория: суть композиции
    0
    Я не говорю, что вы не должны знать физику вообще. Но для управления самолетом вам не нужно знать физику в объеме, который необходим для создания вами самолета.
  • Категория: суть композиции
    0
    Если брать конечный результат, то да — разницы между циклами и рекурсией никакой. Но если рассматривать то, каким образом этот результат достигается, то разница есть: в циклах вы оперируете на уровне каждого отдельного значения в коллекции, а в рекурсии вы оперируете на уровне коллекции целиком. То есть разница — в уровне абстракции. Как современные императивные языки абстрагируются от машинного кода, так и функциональные языки абстрагируются от уровня отдельных элементов коллекции.
  • Категория: суть композиции
    +4
    Попытаюсь вам объяснить. Но для этого вам нужно попытаться переформулировать свой вопрос «В какой конкретной задаче мне может помочь функтор?» и сформулировать его на более высоком уровне абстракции: «Как функторы могут мне помочь в программировании вообще?» (т.е. в решении любых задач, а не какой-то конкретной).

    Что такое функторы, монады и прочие концепции в Haskell? Это шаблоны, которые реализованы в языке для того, чтобы нам было легче решать различные классы задач:

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

    Но что, если нам нужно выйти за пределы «чистых» функций? Например, нам нужен определенный порядок вычислений (то есть одна функция должна знать, вычислена ли другая функция или нет). Или мы взаимодействуем с внешним миром, и в качестве результата выполнения нашей функции мы можем получить не одно, а много разных значений (недетерминированные вычисления). Или нам нужно «тащить» за собой, помимо результата функции, некое состояние. Для всех этих случаев, когда у значения результата наших функций есть некий «контекст», как мы это называем, Haskell предлагает нам использовать определенный шаблон — монады. При помощи этого шаблона мы можем унифицированно работать со всеми случаями, когда у нас имеется значение плюс какой-то контекст (мы обычно называем это значением, «обернутым» в контекст).

    ОК, у нас есть значения, обернутые в контекст. Но что нам делать, если мы хотим как-то трансформировать это значение? Можно написать отдельные функции для трансформации значения, «обернутого» в контекст. Но можно не плодить лишний код, а использовать еще один шаблон — функторы. С помощью этого шаблона мы можем применять функции, определенные для значений без контекста, к значениям, обернутым в контекст. И опять таки — мы можем использовать этот шаблон во всех случаях, когда нам нужно применять «чистую» функцию к значениям, «обернутым» в любой контекст.

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

    Можно ли программировать на Haskell, не зная или не понимая этих концепций? Да, можно. Но их знание и понимание облегчает программирование.

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

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

    И позвольте, в заключение, «перевести» некоторые ваши вопросы на «ООП-язык», чтобы вы лучше поняли, что рассматриваемые понятия — это не алгоритмы, а концепции:

    То, что мы можем ввести классы объектов… Ну. Замечательно. Но что с того? Если я пишу, допустим, текстовый редактор, как это мне поможет?


    Повторюсь: вот пишу я текстовый редактор, где мне могут пригодиться классы объектов?


    Интересным был бы пример какой-нибудь такой: допустим, нам надо посчитать спектр матрицы, объекты помогут нам в этой задаче так-то и так-то. Ну, или не знаю… При перемножении больших чисел через преобразование Фурье. Ну, то есть, в задаче, где есть реальные проблемы со сложностью кода. Было бы неплохо показать, в каком месте объектный подход срабатывает лучше теории типов.


    Надеюсь, стало понятнее ;)).
  • Категория: суть композиции
    0
    Вообще, одно из главных отличий функциональных языков от императивных, которое нужно понять, и которое обычно мешает императивщикам приучиться мыслить в функциональном стиле — это оперирование в терминах коллекций значений, а не на уровне отдельного значения в коллекции. То есть нужно перейти на более высокий уровень абстракции. Именно поэтому в функциональных языках нет циклов (потому что там вы думаете, что нужно сделать с каждым отдельным элементом коллекции), но есть функции высшего порядка, которые работают с коллекциями целиком.

    Если пытаться подобрать аналогию из реального мира, то, когда перед функциональщиком стоит задача расставить мебель в комнате, он мыслит категориями единиц мебели (диван, стул, стол, кресло и т.д.), а императивщик — категориями частей, из которых состоит мебель (досточки, гаечки, шурупчики и т.д.). Оба подхода имеют право на существование, просто функциональный подход основан на более высоком уровне абстракции.
  • Категория: суть композиции
    0
    Циклов в Хаскелле нет. А map — это просто синоним fmap для списков. Со списками вы можете употреблять как map, так и fmap, а с другими «обернутыми» значениями нужно употреблять fmap.

    instance Functor [] where 
    fmap = map
    
  • Категория: суть композиции
    +3
    Практический смысл функторов объяснить очень просто. Смысл в повторном использовании функций, которые у нас уже определены.

    1. У нас есть нумерические типы (Int, Integer, Double, Float), для которых уже определена функция сложения (+).

    2. У нас есть «обертки» для нумерических типов (например, список нумерических значений [1, 2, 3, 4], или значение Just 5 типа Maybe).

    3. При помощи функтора fmap мы можем повторно использовать уже имеющуюся у нас функцию сложения (+) для «обернутых» нумерических значений, вместо того, чтобы писать новую функцию:
    fmap (+ 1) [1, 2, 3, 4]
    > [2, 3, 4, 5]
    
    fmap (+ 1) (Just 5)
    > Just 6
    


    Применив «обертку» к типу А, мы, тем самым, получили новый тип Б. Тем не менее, мы можем, при помощи функторов, применять функции, определенные для типа А, к значениям типа Б.

    Тем самым вы избавляетесь от необходимости определять отдельные функции для «обернутых» типов, что, без сомнения, уменьшит количество и времени, и кода, как при написании текстового редактора, так и при написании других программ.
  • Невидимые скиммеры: новое слово в мошенничестве с кредитками
    0
    Украинский Приватбанк, когда вы собираетесь снять деньги в банкомате, который расположен не в том микрорайоне, где вы обычно снимаете деньги, высылает смс с кодом и просит ввести его в банкомате. Пару раз я давал жене свою карточку, чтобы она сняла деньги по пути, чтобы не выходить из дома специально к банкомату, и ей приходилось звонить мне и спрашивать код, который пришел на мой телефон. Потом открыл ей отдельную карточку, привязанную к тому же счету.
  • Как мы делали школу мобильных разработчиков в Саранске
    0
    Попробуйте начать записывать видео (это сэкономит вам время на будущих курсах) и использовать платформу Khan Academy. Если вы посмотрели видео, то он там рассказывает о ней и показывает, насколько мощной аналитической системой она обладает.