使用子类型

时间:2016-01-15 23:32:39

标签: scala scalaz

我正在玩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。

1 个答案:

答案 0 :(得分:0)

我重新考虑了这个问题并对其进行了重新修改 - 并得到了答案,请看到:Typeclasses and inheritance in scalaz