Здравствуйте, Ka3a4oK, Вы писали:
KK>Это засада. Что делать?
Использовать макросы
using Nemerle.Extensions;
variant Foo
{
[StructuralEquality, StructuralHashCode]
| A { v : int; }
[StructuralEquality, StructuralHashCode]
| B { v : int; }
}
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, Ka3a4oK, Вы писали:
__>F#:
А теперь попробуй наследовать их размеченное объединение от какого-либо класса.
variant Foo
{
|A {v:int}
|B {v:int}
}
def h=HashSet();
h.Add(Foo.A(1));
h.Add(Foo.A(1));
После этого размер h становится равным 2. WTF?
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Ka3a4oK, Вы писали:
KK>>После этого размер h становится равным 2. WTF?
H>variant не переопределяет Equals и GetHashcode. Если даже хэш-код у них совпал, то Equals точно вернул false, так как он использует сравнение ссылок.
Это засада.
Что делать?
Здравствуйте, 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]
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, _nn_, Вы писали:
__>>Здравствуйте, Ka3a4oK, Вы писали:
__>>F#:
H>А теперь попробуй наследовать их размеченное объединение от какого-либо класса.
Это к авторам F#, а не ко мне