На основании анализа метода Group в list было установлено, что он правильно работает тогда и только тогда, когда функция cmp обладает свойством транзитивности и рефлективности для операции упорядочивания списка ( см. функцию sort).
Для самого метода Group это избыточно ( достаточно метода correct).
Вопрос – чем вызвано требование упорядочивания списка?
using System;
using System.Console;
using Nemerle;
using Nemerle.Utility;
[Record]
public class Point3D {
[Accessor]
x : int;
[Accessor]
y : int;
[Accessor]
z : int;
public override ToString() : string{
$"($(this.X),$(this.Y),$(this.Z))"
}
}
module Program
{
Main() : void
{
def l = [
Point3D(1,1,1),
Point3D(1,2,2),
Point3D(1,3,3),
Point3D(2,1,4),
Point3D(2,2,5),
Point3D(2,3,6),
Point3D(1,2,7)];
// То, что работает сейчас
def sort (a,b) {
def l_cmp = a.X.CompareTo ( b.X );
if ( l_cmp == 0 ) {
a.Y.CompareTo ( b.Y )
} else {
l_cmp
}
}
// То, чего достаточно
def correct(a,b) {
Math.Abs(a.X.CompareTo(b.X)) + Math.Abs(a.Y.CompareTo(b.Y))
}
WriteLine($"..$l");
WriteLine(" sort:");
WriteLine($"..$(l.Sort(sort))");
WriteLine($"..$(l.Group(sort))");
WriteLine(" correct:");
WriteLine($"..$(l.Sort(correct))");
WriteLine($"..$(l.Group(correct))");
_ = ReadLine();
}
}
Вывод:
(1,1,1), (1,2,2), (1,3,3), (2,1,4), (2,2,5), (2,3,6), (1,2,7)
sort:
(1,1,1), (1,2,2), (1,2,7), (1,3,3), (2,1,4), (2,2,5), (2,3,6)
[(1,1,1)], [(1,2,7), (1,2,2)], [(1,3,3)], [(2,1,4)], [(2,2,5)], [(2,3,6)]
correct:
(1,2,7), (2,3,6), (2,2,5), (2,1,4), (1,3,3), (1,2,2), (1,1,1)
[(1,2,7)], [(2,3,6)], [(2,2,5)], [(2,1,4)], [(1,3,3)], [(1,2,2)], [(1,1,1)]
... << RSDN@Home 1.2.0 alpha rev. 737>>