复杂类型序列的内联排序
Inline sorting of complex type sequence
我有以下问题:
我有一个 table 映射点 ID (uint16
) 到 Points
(tuple[x: float64, y: float64]
)。给定三个点 ID,我想创建一个 Triangle
,它是按 x 值排序的点 ID 的三元组(然后按 y 值排序)。
我通过将三个点 ID 和 table 传递给构造函数来创建 Triangle
。然后它应该从 table 中选择相应的 Point
s,相应地对它们进行排序,然后 return 三角形。
但是,我无法使内联排序正常工作。错误是在我调用 vec.sort
的那一行抛出的。我把它贴在代码下面了。
import tables
import system
type
Point* = tuple[x: float64, y: float64]
PointData* = tuple[id: uint16, point: Point]
Triangle* = tuple[left: uint16, middle: uint16, right: uint16]
proc createTriangle*(p1: uint16, p2: uint16, p3: uint16, pointToPosition: Table[uint16, Point]): Triangle =
if p1 in pointToPosition and p2 in pointToPosition and p3 in pointToPosition:
let t1: PointData = (p1, pointToPosition[p1])
let t2: PointData = (p2, pointToPosition[p2])
let t3: PointData = (p3, pointToPosition[p3])
var vec = @[t1, t2, t3]
vec.sort do (a, b: PointData) -> int:
result = system.cmp(a.point.x, b.point.x)
if result == 0:
result = system.cmp(a.point.y, b.point.y)
result = (vec[0].id, vec[1].id, vec[2].id)
else:
raise newException(SystemError, "tried to create Triangle with unknown point IDs")
错误:
types.nim(31, 8) Error: type mismatch: got (seq[PointData], void)
but expected one of:
proc sort[A](t: CountTableRef[A])
proc sort[A, B](t: var OrderedTable[A, B]; cmp: proc (x, y: (A, B)): int)
proc sort[A, B](t: OrderedTableRef[A, B]; cmp: proc (x, y: (A, B)): int)
proc sort[A](t: var CountTable[A])
由于某种原因,我的内联排序过程存在类型不匹配。它说它得到了 void
而不是它。怎么回事?
你做得对,除了你忘记导入模块 algorithm
,其中定义了 seq
s 的排序。也不需要 import system
因为它总是隐式导入。
我有以下问题:
我有一个 table 映射点 ID (uint16
) 到 Points
(tuple[x: float64, y: float64]
)。给定三个点 ID,我想创建一个 Triangle
,它是按 x 值排序的点 ID 的三元组(然后按 y 值排序)。
我通过将三个点 ID 和 table 传递给构造函数来创建 Triangle
。然后它应该从 table 中选择相应的 Point
s,相应地对它们进行排序,然后 return 三角形。
但是,我无法使内联排序正常工作。错误是在我调用 vec.sort
的那一行抛出的。我把它贴在代码下面了。
import tables
import system
type
Point* = tuple[x: float64, y: float64]
PointData* = tuple[id: uint16, point: Point]
Triangle* = tuple[left: uint16, middle: uint16, right: uint16]
proc createTriangle*(p1: uint16, p2: uint16, p3: uint16, pointToPosition: Table[uint16, Point]): Triangle =
if p1 in pointToPosition and p2 in pointToPosition and p3 in pointToPosition:
let t1: PointData = (p1, pointToPosition[p1])
let t2: PointData = (p2, pointToPosition[p2])
let t3: PointData = (p3, pointToPosition[p3])
var vec = @[t1, t2, t3]
vec.sort do (a, b: PointData) -> int:
result = system.cmp(a.point.x, b.point.x)
if result == 0:
result = system.cmp(a.point.y, b.point.y)
result = (vec[0].id, vec[1].id, vec[2].id)
else:
raise newException(SystemError, "tried to create Triangle with unknown point IDs")
错误:
types.nim(31, 8) Error: type mismatch: got (seq[PointData], void)
but expected one of:
proc sort[A](t: CountTableRef[A])
proc sort[A, B](t: var OrderedTable[A, B]; cmp: proc (x, y: (A, B)): int)
proc sort[A, B](t: OrderedTableRef[A, B]; cmp: proc (x, y: (A, B)): int)
proc sort[A](t: var CountTable[A])
由于某种原因,我的内联排序过程存在类型不匹配。它说它得到了 void
而不是它。怎么回事?
你做得对,除了你忘记导入模块 algorithm
,其中定义了 seq
s 的排序。也不需要 import system
因为它总是隐式导入。