在object Sized
中(在shapeless/sized.scala中)有unapplySeq
,不幸的是它不提供静态检查。例如下面的代码在运行时会失败:
Sized(1, 2, 3) match { case Sized(x, y) => ":(" }
如果有unapply
方法会更好,返回元组的Option,元组的具体形状根据Sized示例的大小构造。例如:
Sized(1) => x
Sized(1, 2) => (x, y)
Sized(1, 2, 3) => (x, y, z)
在这种情况下,前面的代码片段将无法使用constructor cannot be instantiated to expected type
编译。
请帮助我实现unapply
为object Sized
。这个方法已经在任何地方实现了吗?
先谢谢你了!
2条答案
按热度按时间k5ifujac1#
这绝对是可能的(至少对于
Sized
,其中N
小于23),但我能想到的唯一方法(禁止宏等)有点混乱。首先,我们需要一个类型类来帮助我们将大小的集合转换为HList
s:然后我们可以定义一个使用这种转换的提取器对象:
然后:
但是:
如你所愿。
pobjuy322#
您可以在
Sized
上调用.tupled
来获取静态检查的unapply。