Странности с массивами
От: Ka3a4oK  
Дата: 14.02.11 16:25
Оценка:
Почему так работает?

def tbl=HashTable();
tbl.Add([1, 2, 3]);
match(tbl.Get([1, 2, 3]))
{
|Some(x)=>
  WriteLine("ok")  // попадаем сюда
|None()=>
  WriteLine("fail")
}


А так не работает:

def tbl=HashTable();
tbl.Add(array[1, 2, 3]);
match(tbl.Get(array[1, 2, 3]))
{
|Some(x)=>
  WriteLine("ok")
|None()=>
  WriteLine("fail") // попадаем сюда
}


И как мне сделать такой хештэйбл: Hashtable[((int*int)*array[int]), int]?
Re: Странности с массивами
От: hardcase Пират http://nemerle.org
Дата: 14.02.11 16:29
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Почему так работает?


KK>
KK>def tbl=HashTable();
KK>tbl.Add([1, 2, 3]);
KK>match(tbl.Get([1, 2, 3]))
KK>{
KK>|Some(x)=>
KK>  WriteLine("ok")  // попадаем сюда
KK>|None()=>
KK>  WriteLine("fail")
KK>}
KK>


а) Потому что для списков переопределены Equals и GetHashcode.


KK>А так не работает:


KK>
KK>def tbl=HashTable();
KK>tbl.Add(array[1, 2, 3]);
KK>match(tbl.Get(array[1, 2, 3]))
KK>{
KK>|Some(x)=>
KK>  WriteLine("ok")
KK>|None()=>
KK>  WriteLine("fail") // попадаем сюда
KK>}
KK>


б) Потому что для массивов не переопределены Equals и GetHashcode


KK>И как мне сделать такой хештэйбл: Hashtable[((int*int)*array[int]), int]?


Никак. В силу ответа б).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Странности с массивами
От: Аноним  
Дата: 14.02.11 16:41
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Ka3a4oK, Вы писали:


KK>>Почему так работает?


KK>>
KK>>def tbl=HashTable();
KK>>tbl.Add([1, 2, 3]);
KK>>match(tbl.Get([1, 2, 3]))
KK>>{
KK>>|Some(x)=>
KK>>  WriteLine("ok")  // попадаем сюда
KK>>|None()=>
KK>>  WriteLine("fail")
KK>>}
KK>>


H>а) Потому что для списков переопределены Equals и GetHashcode.



KK>>А так не работает:


KK>>
KK>>def tbl=HashTable();
KK>>tbl.Add(array[1, 2, 3]);
KK>>match(tbl.Get(array[1, 2, 3]))
KK>>{
KK>>|Some(x)=>
KK>>  WriteLine("ok")
KK>>|None()=>
KK>>  WriteLine("fail") // попадаем сюда
KK>>}
KK>>


H>б) Потому что для массивов не переопределены Equals и GetHashcode



KK>>И как мне сделать такой хештэйбл: Hashtable[((int*int)*array[int]), int]?


H>Никак. В силу ответа б).


Как минимум этот код должен выдавать ошибку во время компиляции т.к. ("для массивов не переопределены Equals и GetHashcode")
Re[3]: Странности с массивами
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.11 16:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как минимум этот код должен выдавать ошибку во время компиляции т.к. ("для массивов не переопределены Equals и GetHashcode")


С чего бы это? Методы же у массива реализованы. Только они сравнивают не данные хранимые в массивах, а экзепляры массива (используют реализацию указанных методов из класса object).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Странности с массивами
От: Аноним  
Дата: 14.02.11 16:48
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Аноним, Вы писали:


А>>Как минимум этот код должен выдавать ошибку во время компиляции т.к. ("для массивов не переопределены Equals и GetHashcode")


VD>С чего бы это? Методы же у массива реализованы. Только они сравнивают не данные хранимые в массивах, а экзепляры массива (используют реализацию указанных методов из класса object).


с того что поведение не предсказуемо и не однозначно. Это тоже самое что если бы сравнение целых чисел было бы по значению а строк по ссылке...

как минимум сильный глюк архитектуры языка
Re[5]: Странности с массивами
От: Ziaw Россия  
Дата: 14.02.11 16:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как минимум сильный глюк архитектуры языка


При чем тут язык? Это библиотеки, попробуй сравнить массивы в C#.
Re[6]: Странности с массивами
От: Аноним  
Дата: 14.02.11 17:00
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>как минимум сильный глюк архитектуры языка


Z>При чем тут язык? Это библиотеки, попробуй сравнить массивы в C#.



Это я понимаю, но теперь попробуй сравнить список в C#?
Re[5]: Странности с массивами
От: WolfHound  
Дата: 14.02.11 17:04
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>как минимум сильный глюк архитектуры языка

Это глюк архитектуры всего .НЕТ.
К сожелению выкинуть .НЕТ пока не представляется возможным ибо сил писать свою ВМ пока нет, а другие ВМ еще хуже.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Странности с массивами
От: Ka3a4oK  
Дата: 14.02.11 17:11
Оценка:
H>Никак. В силу ответа б).

И как мне решить эту проблему? Обернуть массив в структуру?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[3]: Странности с массивами
От: WolfHound  
Дата: 14.02.11 17:14
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>И как мне решить эту проблему? Обернуть массив в структуру?

Можно так или можно реализовать System.Collections.Generic.IEqualityComparer[T] и передать его в конструктор Hashtable.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Странности с массивами
От: Аноним  
Дата: 14.02.11 17:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>как минимум сильный глюк архитектуры языка

WH>Это глюк архитектуры всего .НЕТ.
WH>К сожелению выкинуть .НЕТ пока не представляется возможным ибо сил писать свою ВМ пока нет, а другие ВМ еще хуже.

Можно просто заблокировать подобные методы или переименовать.
Re[4]: Странности с массивами
От: Ka3a4oK  
Дата: 14.02.11 17:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Ka3a4oK, Вы писали:


KK>>И как мне решить эту проблему? Обернуть массив в структуру?

WH>Можно так или можно реализовать System.Collections.Generic.IEqualityComparer[T] и передать его в конструктор Hashtable.

А как вообще узнать как компарация производится для типа?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[5]: Странности с массивами
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.11 17:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>с того что поведение не предсказуемо и не однозначно. Это тоже самое что если бы сравнение целых чисел было бы по значению а строк по ссылке...


Здорово! Но мы то тут причем? Это поведение определяется реализацией находящейся в .net framework. Так что заловаться надо в MS.

А>как минимум сильный глюк архитектуры языка


Язык то тут причем?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Странности с массивами
От: Аноним  
Дата: 14.02.11 17:54
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Аноним, Вы писали:


А>>с того что поведение не предсказуемо и не однозначно. Это тоже самое что если бы сравнение целых чисел было бы по значению а строк по ссылке...


VD>Здорово! Но мы то тут причем? Это поведение определяется реализацией находящейся в .net framework. Так что заловаться надо в MS.


А>>как минимум сильный глюк архитектуры языка


VD>Язык то тут причем?


Список сделали в немерли вы? и получение хеша идет той же функцией? но работает не как принято в немерли.

В действительности в общем не так важно как работает, главное что бы всегда или так или эдак... а не то так то эдок.
Re: Странности с массивами
От: Аноним  
Дата: 14.02.11 18:13
Оценка:
Поясняю, что я считаю ошибкой проектирования.

Возможно надо добавить проверку на перекрытие метода. В случае если метод не перекрыт то выдавать предупреждение при компиляции. Это мягкое решение.
Re[7]: Странности с массивами
От: Ziaw Россия  
Дата: 14.02.11 18:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это я понимаю, но теперь попробуй сравнить список в C#?


Немерловый? Будет вести себя точно так же как и в nemerle. Сравнение по значению это одна из его фич. Если бы он вел себя точно так же как List[T] из фреймворка не было бы никакой надобности в своей реазлизации.
Re[2]: Странности с массивами
От: Ziaw Россия  
Дата: 14.02.11 18:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Поясняю, что я считаю ошибкой проектирования.


А>Возможно надо добавить проверку на перекрытие метода. В случае если метод не перекрыт то выдавать предупреждение при компиляции. Это мягкое решение.


Это нарушение принципов OOP — раз. Как минимум мне такие предупреждения будут мешать — два.
Re[8]: Странности с массивами
От: Аноним  
Дата: 14.02.11 18:19
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>Это я понимаю, но теперь попробуй сравнить список в C#?


Z>Немерловый? Будет вести себя точно так же как и в nemerle. Сравнение по значению это одна из его фич. Если бы он вел себя точно так же как List[T] из фреймворка не было бы никакой надобности в своей реазлизации.


Ура. Кто то понял. Немерли пользуется библиотекой нет, но свои типы работают не аля нет.
То есть неоднозначность, дополнительный нюанс который надо изучать человеку. Дополнительный кладезь ошибок.
Re[3]: Странности с массивами
От: Аноним  
Дата: 14.02.11 18:38
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>Поясняю, что я считаю ошибкой проектирования.


А>>Возможно надо добавить проверку на перекрытие метода. В случае если метод не перекрыт то выдавать предупреждение при компиляции. Это мягкое решение.


Z>Это нарушение принципов OOP — раз. Как минимум мне такие предупреждения будут мешать — два.


2. Ты часто пользуешься хешем ссылок? (предупреждение только в этом случае)

1. нарушение принципов ООР — где именно? просто блокируются потенциально опасные методы.
Re[7]: Странности с массивами
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.11 18:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Список сделали в немерли вы?


Да. Точнее авторы языка — поляки.

А>и получение хеша идет той же функцией? но работает не как принято в немерли.


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

Обходной путь есть. Можно использовать вешний объект-компоратор.

А>В действительности в общем не так важно как работает, главное что бы всегда или так или эдак... а не то так то эдок.


Все зависит от объекта. На самом деле все работает правильно. Если поместить ссылку на массив в переменную и проверять ее, то результат будет правильным. Тут вопрос в другом. Для массивов просто не реализованы методы эквивалентности по содержимому.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.