是否可以在Scala中自动获得密封特质家族的订单?
例如,很高兴能够做到:
sealed trait Letters
case object A extends Letters
case object B extends Letters
(A < B) == True
这感觉像Shapeless可能可以处理的东西,但是我看不到它是否当前存在。
最佳答案
我假设您希望排序反射(reflect)定义的顺序,而不是按构造函数的名称排序。
这并不是您所期望的那么有趣,因为 knownDirectSubclasses
API上的ClassSymbol
返回了一组符号,而不是有序序列。我不是scalac内部专家,但是according to Eugene Burmako(谁是),knownDirectSubclasses
的签名仅反射(reflect)了scalac中正在发生的事情。
顺便说一句,我已经使用complaining about this多年了,在很多时候,我都尝试过类似reading positions off the symbols的操作,但实际上并没有用。
Shapeless的通用机制必须在这里做出决定,因为它将密封特性表示为副产品,对它们的元素进行排序。为了使事情具有确定性,它使用构造函数的名称对案例进行排序:
// Entering paste mode (ctrl-D to finish)
sealed trait Letters
case object B extends Letters
case object A extends Letters
// Exiting paste mode, now interpreting.
defined trait Letters
defined object B
defined object A
scala> shapeless.Generic[Letters]
res5: shapeless.Generic[Letters]{type Repr = shapeless.:+:[A.type,shapeless.:+:[B.type,shapeless.CNil]]} = anon$macro$45$1@71a11be4
如果这是您想要的,那么您就已经准备就绪,只需在基于Shapeless的泛型派生上找到一个good tutorial并确定细节即可。不幸的是,在大多数情况下,它可能不是您想要的(
East
,North
,South
,West
?Blue
,Green
,Red
?),而且您想要的(定义顺序)似乎不太可能。关于scala - Scala中自动导出的密封特征/ADT排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36304785/