我正在玩scalaz并且认为我可以扩展Enum
类型类以使自己更好地理解scalaz。所以我写了这个:
sealed abstract trait Counter
case object First extends Counter
case object Second extends Counter
case object Third extends Counter
implicit val enumCounter: Enum[Counter] = new Enum[Counter] {
override def succ(a: Counter): Counter = a match {
case First => Second
case Second => Third
case Third => First
}
override def pred(a: Counter): Counter = a match {
case First => Third
case Second => First
case Third => Second
}
override def order(x: Counter, y: Counter): Ordering = {
val map = Map[Counter, Int](First -> 0, Second -> 1, Third -> 2)
implicitly[Order[Int]].order(map(x), map(y))
}
}
println(First |=> Third)
println(First.succ)
但事实证明它并不像我希望的那样有效。 First
没有succ
也没有|=>
,因为我创建了Enum[Counter]
但没有Enum[First]
。如果我写First.asInstanceOf[Counter].succ
它就会开始解决。这对我来说是显而易见的。但是,如何以简单的方式实现Enum
类型类?我不想为Enum[First]
,Enum[Second]
....
我正在考虑两种可能的解决方案:
1)让scala将Enum[First]
解析为Enum[Counter]
。但我似乎无法理解这是如何可能的,因为Enum
只能是非变数
2)也许scalaz中有解决方案?
否则Enum
类型类开始非常有限,因为它不支持Enum,这听起来很奇怪。
我实际上不确定这个问题属于scalaz
多少,这可能取决于解决方案是(1)还是(2)。如果解决方案是(1) - 这个问题是纯粹的scala。