Scala - 使自定义类型协变

时间:2012-03-24 06:07:22

标签: scala types covariance

我想使用type关键字制作两个自定义类型,并使它们与其他类型协变,以便我可以将它们放在一个列表或地图中并通过模式匹配来处理它,是可能的?

type Reaction

type Condition = () => Boolean

type ComplexReaction extends Reaction = (Condition) => Unit
type SimpleReaction extends Reaction = () => Unit

val map = Map[Condition, Reaction]

def addPair(c: Condition, a: Reaction) { map += (c -> a) }

def executeAll {
  for(puffy <- map) puffy match {
    case (c, a: ComplexReaction) => a(c)
    case (c, a: SimpleReaction) => if(c) a()
  }
}

但当然Scala中不允许使用type构造。有没有办法实现类似的结果,还是我必须制作两个单独的地图?

2 个答案:

答案 0 :(得分:2)

这是一个可能很好的方法。

type Condition = () => Boolean

sealed trait Reaction
case class ComplexReaction(a: (Condition) => Unit) extends Reaction
case class SimpleReaction(a: () => Unit) extends Reaction

val map = Map[Condition, Reaction]

def addPair(c: Condition, a: Reaction) { map += (c -> a) }

def executeAll {
  for(puffy <- map) puffy match {
    case (c, ComplexReaction(a)) => a(c())
    case (c, SimpleReaction(a)) => if(c()) a()
  }
}

作为旁注,这是我通常在Haskell中所做的事情(将任何有冲突的type更改为newtype s。)

答案 1 :(得分:2)

我有几乎相同的解决方案,我已经简化了条件类型,通过名称参数添加调用并将地图更改为可变:

type Condition = Boolean

sealed abstract class Reaction

case class ComplexReaction(rec: (=> Condition) => Unit) extends Reaction

case class SimpleReaction(rec: () => Unit)  extends Reaction 


var map = Map[Condition, Reaction]()

def addPair(c: Condition, a: Reaction) { map += (c -> a) }

def executeAll {
for(puffy <- map) puffy match {
case (c, ComplexReaction(i)) => i(c)
case (c, SimpleReaction(i)) => if(c) i()
}
}
相关问题