Pull to refresh
103
0
Arthur Welf @art_of_press

User

Send message
Вы можете быть татарином и не зная татарского языка.

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

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

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

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

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

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

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

Что касается чистых функций, то вы их просто применяете внутри do-блока к значениям состояния и «основных» вычислений, которые вы «вытащили» из обёртки. Они производят вычисления, а затем возвращают результат обратно в вашу обёртку (в do-блок, откуда пришли их аргументы).
Возьмём вот эту строчку, и представим, что 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] :)
В этой статье описываются дополнительные способы мемоизации. А вообще, когда вы в каком-то выражении используете «переменную», то она, благодаря ленивой природе языка, не вычисляется сразу, а сохраняется в виде так называемого thunk (отложенное вычисление). А переменная содержит ссылку на этот thunk. Другие переменные с тем же именем, содержат ссылку не на свой отдельный thunk, а на тот же. Когда thunk вычисляется, он заменяется вычисленным значением. А значит, другие переменные, ссылающиеся на него же, не должны вычислять его снова, а берут уже вычисленное значение.
Вы забываете о том, что у вас в кортеже могут быть значения совершенно разных типов. Давайте попробуем представить, что компилятор позволил вам реализовать fmap для тройки так, как вы хотите, и попробуем применить fmap (+1) к тройке:

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

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

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

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

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

[2,4..10]

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

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

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

add :: (Num a) => (a, a) -> a

Information

Rating
Does not participate
Date of birth
Registered
Activity