Клетка для кота

Oct 25, 2022 16:05

Коты - это подмножество животных или, если угодно, кот - частный случай животного. Всё, что является котом, является и животным тоже, однако не каждое животное является котом.


Read more... )

логика, философия, программирование

Leave a comment

Comments 131

lj_frank_bot October 25 2022, 13:07:04 UTC
Здравствуйте!
Система категоризации Живого Журнала посчитала, что вашу запись можно отнести к категории: Животные.
Если вы считаете, что система ошиблась - напишите об этом в ответе на этот комментарий. Ваша обратная связь поможет сделать систему точнее.
Фрэнк,
команда ЖЖ.

Reply

lex_kravetski October 25 2022, 13:10:59 UTC
Тема - логика.

Reply


rdcrypt October 25 2022, 13:33:20 UTC
>Любая клетка для животного - клетка и для кота тоже

Разве такой тайпкаст будет одобрен компилятором с̶к̶а̶л̶ы̶?
Т.е. мы можем положить в клетку для животного кота\крокодила\мамонта т.д., но мы не можем считать ее именно клеткой для кота, а только клеткой для какого-то (любого) животного.
И надо каждый раз чекать, кого мы оттуда достали, т.к. мы потеряли компайл-тайм информацию о том, кто там сидит.

Reply

lex_kravetski October 25 2022, 13:44:00 UTC
>> Любая клетка для животного - клетка и для кота тоже

> Разве такой тайпкаст будет одобрен компилятором с̶к̶а̶л̶ы̶?

Да, так тоже можно. И в Java тоже. И даже тайпкаст не нужен.

Если Cat наследник Animal, то Cage[Animal] подойдёт на место Cage[? super Cat].

Но вот как раз в Скале и C# все эти фокусы без ловких рефлекшенов уже не сработают.

Reply

lex_kravetski October 25 2022, 15:21:44 UTC
> Т.е. мы можем положить в клетку для животного кота\крокодила\мамонта т.д., но мы не можем считать ее именно клеткой для кота, а только клеткой для какого-то (любого) животного.

В Java оба фокуса возможны, в Scala - оба невозможны без рефлекшенов.

Поскольку в Java содержимое Cage[? super Cat] и Cage[? extends Animal] на этапе компиляции никак не проверяется на безопасность, а в Scala надо в явном виде указать, в какую сторону будет идти «наследование» клеток относительно типа их содержимого, после чего компилятор запретит все «читерские» позиции для этого типа. Так, если Cage[Cat] может быть преобразован в Cage[Animal], то в Cage уже нельзя будет сделать метод replaceBy(newContent: T). Возникнет ошибка времени компиляции.

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

Reply

rdcrypt October 25 2022, 16:17:46 UTC
>Так, если Cage[Cat] может быть преобразован в Cage[Animal], то в Cage уже нельзя будет сделать метод replaceBy(newContent: T).

Это понятно. Cудя по статье, мы хотим мутабельную клетку, а не иммутабельную типа L̶i̶s̶t̶[̶+̶A̶]̶ MultiCage[+A], где "подсадив" (создав новую клетку для нескольких животных) крокодила к коту, мы получим MultiCage[Animal], как ближайшего общего предка.

Reply


deminded October 25 2022, 14:18:06 UTC
"«Клеткой для кота» мы будем называть такую клетку, в которую можно поместить всё то, что является котом, и если уж мы из неё что-то достанем, то это что-то будет котом."
"Попросим клетку для кота у хозяина кота и объявим её клеткой для животного: клетка для кота ведь частный случай клетки для животного."

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

Не понимаю как в рамках нашей обычной логики мы путем объявления поменяли свойства объекта (перестало работать правило "если уж мы из неё что-то достанем, то это что-то будет котом").
Если мы можем положить и достать крокодила, то клетка, которую мы попросили у хозяина кота, исходно не отвечала этому условию, то есть не была "клеткой для кота", хотя ее таковой называл сам хозяин.

Reply

lex_kravetski October 25 2022, 14:34:26 UTC
> Селедка частный случай рыбы. Купим селедку, объявим ее рыбой и продадим по цене лосося, ведь лосось тоже рыба.

Такое действие не прокатит, если у «рыбы» нет свойства продаваться по произвольной цене.

У «клетки для животного» совсем не зря заявлено свойство «в неё можно поместить животное и только животное». Для «рыбы» было бы аналогом «её можно продать по цене рыбы», но какая цена у абстрактной рыбы?

> Если мы можем положить и достать крокодила, то клетка, которую мы попросили у хозяина кота, исходно не отвечала этому условию

«Клетка для животного» этому свойству отвечает: в неё можно положить животное, а крокодил - животное. В это время по текущему предположению «клетка для кота» - частный случай «клетки для животного», поэтому любая клетка для кота по этому предположению обязательно будет клеткой для животного.

Reply

deminded October 25 2022, 14:42:11 UTC
Тогда не понял этот момент. Вот есть третий пункт:

"Если клетка для котов - это только клетка для котов, то туда можно помещать котов и извлекаться гарантированно будут тоже только коты. С клеткой для животных, которая только клетка для животных, аналогично: в неё можно засовывать животных, и извлекаться будут только животные. При этом в клетку для кота правда можно поместить животное, но только если это животное - кот. И извлекаться из неё тоже будет животное - всегда то, которое называется «кот»."

Что изменилось по сравнению с исходным определением?

«клетка для кота» - частный случай «клетки для животного» но с дополнительным ограничением, которое вроде бы явно заявлено в исходном определении клетки и которому если клетка следовала до "объявления" ее клеткой для животного, то следовать ему после этого объявления она и не должна перестать.

То есть "в которую можно поместить всё то, что является котом, и если уж мы из неё что-то достанем, то это что-то будет котом.". Не хватает слова только? В которую можно поместить только то, ( ... )

Reply

lex_kravetski October 25 2022, 15:26:02 UTC
> Что изменилось по сравнению с исходным определением?

Изменилось то, что в этом случае клетку для кота никогда нельзя будет считать клеткой для животного, а клетку для животного никогда нельзя будет считать клеткой для кота.

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

Reply


ext_2251255 October 25 2022, 15:38:52 UTC
Не понял 🤣

>>если уж коты - подмножество животных, то клетки для котов - подмножество клеток для животных

Но поскольку это противоречит определению клетки для котов, то значит неверно сразу 🤷🏼

Reply


xalkin October 25 2022, 16:35:15 UTC
Поздравляю! Вы изобрели ковариантность и контравариантность =)

Reply

lex_kravetski October 25 2022, 19:04:53 UTC
И совершенно случайно объяснил её на примере контейнеров для котов!

Reply

xalkin October 26 2022, 05:12:03 UTC
А ее часто так и объясняют, только контейнерами выступают всякие List.

Reply

lex_kravetski October 26 2022, 06:53:05 UTC
Я же говорю: случайное совпадение. Так-то я сам всё придумал.

Reply


Leave a comment

Up