let me show you something
May. 15th, 2010 11:04 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
I was experimenting with Set[T] functor variance. Here are my considerations regarding the opportunity to make it contravariant. In short: it's impossible.
So, what I am thinking. Can we make Set functor contravariant in OOP? I mean, we have two problems here:
Seems like variance just does not work here.
I'll continue investigating the opportunities for covariance.
/** * Casts a set into a set of subtype (contravariance, that is) * This method does not work, due to JVM type erasure. * Actually, delegating the work to runtime would be a stupid idea anyway; * so, is it a general problem with oop? Have to think. */ @Deprecated /*implicit*/ def downshift[A, B >: A] (source: Set[B]) : Set[A] = { val b2a: (B => A) = {case (a: A) => a} val elements = {for (b <- source; if b.isInstanceOf[A]) yield b2a(b)} setOf(elements, source.size, source.contains _) }
So, what I am thinking. Can we make Set functor contravariant in OOP? I mean, we have two problems here:
- Java type erasure makes it impossible to actually check the element type;
- OOP in general forces us to delegate this type checking to runtime - which is, I assume, a wrong idea
Seems like variance just does not work here.
I'll continue investigating the opportunities for covariance.
no subject
Date: 2010-05-15 06:58 pm (UTC)Прошу извинить, за редактуру =)
no subject
Date: 2010-05-15 07:14 pm (UTC)Славные были времена, в HP сидели ученые и что-то такое писали философское.
no subject
Date: 2010-05-15 07:40 pm (UTC)no subject
Date: 2010-05-15 07:16 pm (UTC)no subject
Date: 2010-05-15 07:29 pm (UTC)no subject
Date: 2010-05-15 08:25 pm (UTC)no subject
Date: 2010-05-15 08:37 pm (UTC)no subject
Date: 2010-05-15 08:47 pm (UTC)f a = x
f b = y
f c = y
(CoPowSet f) {} = {}
(CoPowSet f) {x} = {a}
(CoPowSet f) {y} = {b,c}
(CoPowSet f) {x,y} = {a,b,c}
Мы это вычислять не умеем.
no subject
Date: 2010-05-15 10:32 pm (UTC)no subject
Date: 2010-05-16 01:32 am (UTC)no subject
Date: 2010-05-16 05:45 am (UTC)Хаскельную форму функториальности я не затрагиваю, там категория другая. В скале категория типов и подтипов (ну ооп же). Нет смысла, имхо, вводить функторы, если они не работают на основной категории (подтипы).
no subject
Date: 2010-05-16 06:49 am (UTC)no subject
Date: 2010-05-16 07:39 am (UTC)() :;
(f :) :;
(z:, f : (, ) ) :;
(f :) :;
(y :) : = ! (filter (b y == b)).empty();
}
no subject
Date: 2010-05-16 03:28 pm (UTC)Тут такая штука, что это как бы недостаточно абстрактно. Если мы задаём множество по предикату, то ходить собирать всех, что равны... как-то смысла нету. Но идея всё равно понравилась, надо переварить, спасибо.
no subject
Date: 2010-05-16 08:41 am (UTC)ООП иногда бывает очень странным.
no subject
Date: 2010-05-16 03:25 pm (UTC)no subject
Date: 2010-05-16 04:59 pm (UTC)Если множество задано предикатом, то оно вроде бы как контравариантно, потому что там ничего кроме этого предиката и нету, так?
no subject
Date: 2010-05-16 05:21 pm (UTC)Я использую 2.8, но множество определяю сам (а то слишком резво оно начинает вычисляться). И попробовал побаловаться с вариантностью вот.
no subject
Date: 2010-05-16 05:58 pm (UTC)no subject
Date: 2010-05-16 05:39 am (UTC)no subject
Date: 2010-05-16 05:43 am (UTC)no subject
Date: 2010-05-16 06:51 am (UTC)no subject
Date: 2010-05-16 08:58 am (UTC)no subject
Date: 2010-05-16 04:49 pm (UTC)no subject
Date: 2010-05-18 04:56 am (UTC)no subject
Date: 2010-05-18 06:27 pm (UTC)no subject
Date: 2010-05-18 05:02 am (UTC)