Странность F# ?
От: hyp1k Россия  
Дата: 03.10.14 10:22
Оценка: 1 (1)
Странным показалось поведение F#. В небольшом проекте решил попробовать реализовать алгоритмы на F#. Сущности были описаны code first entity framework. Одна из сущностей, а именно Вершина графа, должна была послужить ключем в структуре map в коде F#. Для этого вершине нужно было дописать методы:
           public int CompareTo(Vertex that)
            {
                return this.ID.CompareTo(that.ID);                
            }

            public int CompareTo(object other)
            {
                    return 0;
            }


Потом оказалось, что если переводишь последовательность вершин в map

verteces |> Seq.map(fun r -> r,-1.0) |> Map.ofSeq

, вызываются не первые методы, а вторые. Приходится править код:
        public int CompareTo(Vertex that)
            {
                return this.ID.CompareTo(that.ID);                
            }

        public int CompareTo(object other)
            {
                if (other is Vertex)
                    return this.ID.CompareTo((other as Vertex).ID); 
                else
                    return 0;
            }

Ничего страшного, просто меня это удивило. Почему не вызывается изначально первый метод?!
fsharp csharp icomparable
Re: Странность F# ?
От: hardcase Пират http://nemerle.org
Дата: 03.10.14 10:59
Оценка: 1 (1)
Здравствуйте, hyp1k, Вы писали:

H>Ничего страшного, просто меня это удивило. Почему не вызывается изначально первый метод?!


1) Вы не дописали IComparable<Vertex> в заголовке своего класса.
2) Map не использует обобщенную версию интерфейса, а ограничивается только IComparable.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Странность F# ?
От: hyp1k Россия  
Дата: 03.10.14 12:09
Оценка:
H>1) Вы не дописали IComparable<Vertex> в заголовке своего класса.
H>2) Map не использует обобщенную версию интерфейса, а ограничивается только IComparable.

Писал так
public class Vertex : BaseEntity, IComparable<Vertex>, IComparable
Re[3]: Странность F# ?
От: hardcase Пират http://nemerle.org
Дата: 06.10.14 10:13
Оценка:
Здравствуйте, hyp1k, Вы писали:

H>Писал так

H>public class Vertex : BaseEntity, IComparable<Vertex>, IComparable

Строго говоря, реализация CompareTo у вас не совсем верная, нужно уметь обрабатывать null значения, ну и код задублирован.

public int CompareTo(Vertex that)
{
  return (that != null) ? this.ID.CompareTo(that.ID) : 1;
}

public int CompareTo(object other)
{
  if (other == null)
    return 1;
  if (other is Verter)
    return CompareTo((Vertex) other)
  else
    throw new ArgumentException("other is not a Vertex");
}
/* иЗвиНите зА неРовнЫй поЧерК */
Отредактировано 06.10.2014 10:21 hardcase (Боаааальше контрактов :)) . Предыдущая версия . Еще …
Отредактировано 06.10.2014 10:17 hardcase . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.