Ошибка с variant?
От: Ka3a4oK  
Дата: 09.02.11 07:50
Оценка:
variant Foo
{
|A {v:int}
|B {v:int}
}

def h=HashSet();

h.Add(Foo.A(1));
h.Add(Foo.A(1));


После этого размер h становится равным 2. WTF?
Re: Ошибка с variant?
От: hardcase Пират http://nemerle.org
Дата: 09.02.11 08:07
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>После этого размер h становится равным 2. WTF?


variant не переопределяет Equals и GetHashcode. Если даже хэш-код у них совпал, то Equals точно вернул false, так как он использует сравнение ссылок.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Ошибка с variant?
От: Ka3a4oK  
Дата: 09.02.11 08:09
Оценка:
Здравствуйте, hardcase, Вы писали:

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


KK>>После этого размер h становится равным 2. WTF?


H>variant не переопределяет Equals и GetHashcode. Если даже хэш-код у них совпал, то Equals точно вернул false, так как он использует сравнение ссылок.


Это засада. Что делать?
Re[3]: Ошибка с variant?
От: hardcase Пират http://nemerle.org
Дата: 09.02.11 08:36
Оценка: 37 (4) +2
Здравствуйте, Ka3a4oK, Вы писали:

KK>Это засада. Что делать?


Использовать макросы

using Nemerle.Extensions;


variant Foo
{
  [StructuralEquality, StructuralHashCode]
  | A { v : int; }
    
  [StructuralEquality, StructuralHashCode]
  | B { v : int; }
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Ошибка с variant?
От: _nn_ www.nemerleweb.com
Дата: 09.02.11 13:32
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

F#:

open System
open System.Collections.Generic

type AA = { v : int }
type BB = { v : int }

type T =
  | A of AA
  | B of BB

let x = HashSet()
x.Add(T.A({ AA.v = 1 })) |> ignore
x.Add(T.A({ AA.v = 1 })) |> ignore

Console.WriteLine(x.Count);


1


Reflector:
[c#]
public abstract class T : IEquatable<Program.T>, IStructuralEquatable, IComparable<Program.T>, IComparable, IStructuralComparable
{
public class A : Program.T { ... }
public class B : Program.T { ... }
...
}
[/c]
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Ошибка с variant?
От: hardcase Пират http://nemerle.org
Дата: 09.02.11 13:36
Оценка: +1
Здравствуйте, _nn_, Вы писали:

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


__>F#:


А теперь попробуй наследовать их размеченное объединение от какого-либо класса.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Ошибка с variant?
От: _nn_ www.nemerleweb.com
Дата: 09.02.11 16:25
Оценка:
Здравствуйте, hardcase, Вы писали:

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


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


__>>F#:


H>А теперь попробуй наследовать их размеченное объединение от какого-либо класса.


Это к авторам F#, а не ко мне
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.