Сейчас я вам прямо в первых же абзацах этой статьи приведу разъяснение, которое не поймёт большинство читателей.
И даже изрядная часть тех, кто умеет программировать.
И даже часть работающих программистами.
Однако я всё равно предлагаю вам продолжить читать статью, поскольку сие разъяснение будет только лишь иллюстрацией к мыслям, которые относятся к образованию и к отношениям людей с информацией, и с самого начала не предполагалось необходимым к пониманию. То есть, конечно, попробовать его понять вы всё равно можете, но текст не про это.
Так вот.
Если у нас есть абстрактный тип T, а также другой абстрактный тип K, свободным параметром конструктора которого является другой тип, то тип K называется «типом высшего порядка», тогда как тип T - типом первого порядка.
Если же в явном виде указать типы K и T, то абстрактный тип G = K[T] тоже станет явно заданным и целиком определённым.
Таким образом, мы можем определять функции с принципиально разными конфигурациями абстрактных типов (Res здесь означает произвольный возвращаемый тип функции, который, в частности, тоже может быть типом первого или высших порядков).
Может быть случай, когда тип аргумента точно известен (например, KnownType[Int] → Res ).
Может быть случай, когда в явно указанный тип высшего порядка параметризован абстрактным типом первого порядка (например, KnownType[T] → Res).
Может быть случай, когда тип высшего порядка параметризован конкретным типом первого порядка (например, K[Int] → Res).
Наконец, могут быть случаи, когда тип аргумента функции - абстрактный тип высшего порядка параметризованный абстрактным же типом первого (например, K[T] → Res).
Последние два случая требуют от языка программирования какой-то специальной конструкции, позволяющей указывать, что некоторый абстрактный тип является типом более высокого порядка. Так, в языке Scala для этого используется конструкция K[_].
Это, в том числе, позволяет повышать порядок типов до сколь угодно высокого (например, Z[Y[K[T]]]), и при определении функций указывать, тип какого порядка в данном случае имеется в виду.
На этом месте, конечно, следовало бы предложить читателю выучить всё это наизусть, а потом сдать по этому делу экзамен, поскольку эта концепция - очень важная, и вообще непонятно, как образованный человек может жить, ничего о ней не зная.
Однако вместо этого я поделюсь с вами ещё одной иллюстрацией-объяснением.
Есть у вас книжный шкаф, в котором вы можете захотеть расставить книги так, чтобы они были сгруппированы по автору. Одновременно с тем у вас может быть шкаф с компакт-дисками, в котором вы можете захотеть сгруппировать компакт-диски по исполнителю.
Книги и компакт-диски вроде бы разные штуки, но всем понятно, что операция-то одна и та же. Поэтому для её описания мы можем не изготавливать два текста, которые отличаются только словами «книга» и «компакт-диск», а ввести понятие «штука с автором» и описать процесс один раз, подразумевая, что на место «штуки с автором» можно подставить «книгу», «компакт-диск», «блю-рей» и дофига чего ещё.
Однако кроме шкафов бывают ещё коробки. В которых тоже могут лежать книги, компакт-диски и другие штуки. В коробке, как и в шкафу, тоже можно что-то упорядочить по автору, причём процесс снова будет отличаться только словами «шкаф» и «коробка».
Таким образом, мы можем ввести в рассмотрение не только «штуки с автором», а ещё и «штуки, в которых могут лежать штуки с автором» или для краткости «контейнеры штук». Оба два - обобщения, для которых возможны идентичные по своей «обобщённости» варианты:
- Шкаф с книгами, коробка с дисками и т.п.
- Шкаф со штуками с автором, коробка со штуками с автором
- Контейнер с книгами, контейнер с дисками
- Контейнер со штуками с автором
Последний вариант является самым общим, однако и третий вариант тоже подразумевает, что у нас должен быть способ указать на то, что бывают не только абстрактные «штуки», но и абстрактные «контейнеры со штуками».
Чтобы сослаться на что-то подобное типу «контейнер со штуками», в языке Scala используется конструкция ТипКонтейнераСоШтуками[_], тогда как тип «шкаф с книгами» был бы записан как Шкаф[Книга].
Впрочем, нам не обязательно останавливаться на уровне «контейнеров со штуками» - можно рассмотреть и, например, шкаф с коробками, в которых лежат книги, то есть «контейнер с контейнерами со штуками»:
ТипКонтейнера2[ТипКонтейнера1[Штука]]
Возможно, вы уже догадались, что «контейнеры со штуками» - это то самое, что в ни хрена не понятном объяснении фигурировало под именем «типы высших порядков», во время которого наверно 99% читателей задавались вопросом, про что это всё и зачем такое вообще придумали?
Но даже если эти два объяснения вы не сопоставили, я практически уверен, что 99% читателей поняли второе объяснение гораздо лучше первого. Просто потому, что первое начинается с формальностей, продолжается формальностями и оканчивается на формальностях, не давая читателю вообще никакого примера из привычной ему области. Тогда как второе начинает с понятного примера, потом его расширяет до столь же понятного, плавно вводя вполне очевидные при таком способе обобщения: «штука с автором» вместо «книги» и «диска», «контейнер со штуками» вместо «шкафа» и «коробки». Кои читатель уже сам, не менее плавно обобщит до теперь уже интуитивно ему понятной концепции. Особенно, если добавить ещё примеров.
Так вот, в результате любви текущей системы образования к абстрактному формализму, несмотря на то что второй вариант несравнимо понятнее, чем первый, и не требует вообще никаких предварительных знаний, кроме тех, которые у всех людей уже есть и так, большинство, не сговариваясь, скажет, что первый вариант «научнее» и «точнее».
Ну, потому что он же абстрактный. Или, потому что там много умных терминов. Или, потому что он по стилю похож на то, что встречалось в учебниках.
Но на самом деле - исключительно потому, что он непонятен читателю или слушателю.
Это удивительный эффект: непонятное кажется людям более «глубоким» и «точным». Проистекает таковое из ряда факторов - от боязни спорить с «более знающими людьми» и ударить в грязь лицом, до чисто мистических эмоций и очарования таинственностью - однако в любом случае этот эффект часто срабатывает, поскольку у общества есть к тому хорошо закрепившаяся привычка.
А в идеале-то он не должен срабатывать вообще никогда.
Формальное объяснение может быть как абсолютно верным, так и полной ерундой - фактически, набором слов.
Неформальное объяснение ровно так же может быть абсолютно верным, а может быть ерундой.
Содержательной разницы между ними нет вообще. Второе не менее информативно, чем первое, не менее доказательно, не менее научно и так далее.
Разница, как уже говорилось, лишь в том, что во второй форме концепцию гораздо проще понять целиком, на это потребуется гораздо меньше времени и, что немаловажно, во второй форме гораздо проще увидеть, каков в данной концепции процент буллшита, даже без предварительной подготовки. Не-не, протолкнуть буллшит, конечно, всё ещё можно и в ней тоже - просто это заметно тяжелее.
По всем этим причинам, разумеется, рационально было бы всегда выбирать именно второй вариант.
Но людям, увы, по привычке кажется, будто первый вариант «глубже и точнее», и что они что-то упустят, если откажутся от этого варианта в пользу более понятного. Ну да, сейчас они, конечно, не понимают, что они упустят, поскольку и саму концепцию не особо-то поняли, но вдруг упустят. Мало ли чо. Непонятно ж что там - где гарантии, что не упустят?
Может показаться, что предпочтение первого варианта второму из опасений что-то упустить - это такой как бы «научный подход», тогда как упрощение - это из «бытовой логики».
На самом деле, всё с точностью до наоборот: если у вас есть телевизор, в устройстве которого вы ничего не понимаете, то действительно лучше внутри ничего не трогать, а в случае проблем звать мастера. Оно для вас действительно сложное, и вы действительно можете это случайно поломать.
Однако концепцией, претендующей на научность, которую вы не понимаете, вы, в отличие от телевизора, не можете пользоваться по назначению - для рациональных выводов. Она для вас будет заклинанием, источником суждений непредсказуемой степени верности или неверности, способом самоуспокоения или риторическим приёмом, но никак не исправно работающим прибором, который вы сознательно можете применять для своих нужд, даже не понимая внутреннего его устройства.
В этом смысле гораздо лучше хорошо понимать менее общий случай, нежели плохо понимать или вообще не понимать более общий. Формальное описание совершенно бесполезно для того, кто не представляет, к чему его можно применить, и не узнает подходящий случай, даже если его встретит. Теория бесполезна для человека, если он не может объяснить, откуда взялись и как связаны между собой её составные части. И, самое главное, если он даже не может проверить запомненную им версию на непротиворечивость и на соответствие реальному миру.
Если же учесть, что и более общий случай вторым способом можно понять гораздо быстрее и надёжнее, то предпочтение первого способа - это просто сложившееся по историческим причинам общественное наваждение, не особо-то сильно отличающееся от преклонения перед авторитетом и безграничного ему доверия.
Коим люди широко пользуются для обмана друг друга и самого себя.
doc-файл