【发布时间】:2015-04-16 10:32:01
【问题描述】:
查看scalaz.Tree[A],它在 A 中是不变的。我正在寻找一种多路树,我可以将层次结构的值转储到其中
例如如果我的 ADT 为
trait MyThing
case object Thing1 extends MyThing
case object Thing2 extends MyThing
我想要一棵 MyThings 的树,如果不对 scalaz 中的 MyThing 进行强制转换,我就无法使用它;
import scalaz.{Scalaz, Tree}
import Scalaz._
val tree = Thing1.asInstanceOf[MyThing].
node(Thing2.asInstanceOf[MyThing].leaf)
这有点痛苦。
- 是否有协变 [+A] 版本的 Tree?
- 首先为什么 Tree 是不变的?
【问题讨论】:
-
顺便说一句,使用类型归属
(Thing1: MyThing)比使用强制类型转换更安全;如果进行了更改,使得Thing1和MyThing之间不再存在关系,则案例将编译但在运行时失败,而归属甚至无法编译。 -
github.com/scalaz/scalaz/pull/383 是关于在 Scalaz 7.1 中删除方差注释的拉取请求;特别是,请参阅链接的 PR #328。而且我还没有检查它是否合适/可能,但与
scalaz.IList#widen使用的相同技术可能适用于此。 -
我建议从相反的方向解决问题——使用静态类型为
MyThing的 ADT 构造函数。 -
感谢 cmets。 @Huw - 我怎么能在
Tree上使用widen?我猜想用扩大 ala IList 风格拉皮条def widen[B](implicit ev: A <~< B): Tree[B] = ev.subst[({type λ[-α] = Tree[α @uncheckedVariance] <~< Tree[B]})#λ](refl)(this) -
是的,就是这样。强烈推荐 Travis 的建议!
标签: scala data-structures tree scalaz