【问题标题】:Scala - make custom types covariantScala - 使自定义类型协变
【发布时间】:2012-04-08 15:00:40
【问题描述】:

我想用 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()
  }
}

当然,这种type 构造在Scala 中是不允许的。有什么方法可以达到类似的结果,还是我必须制作两个单独的地图?

【问题讨论】:

  • 创建一个简单的案例类层次结构,而不仅仅是键入同义词。
  • 啊,是的,使用特殊的apply 方法对吗?我会试试看。
  • 不,Scala 不明白具有单个 apply() 方法的类可以像 () =&gt; doSomething() 一样被实例化......多么可悲......
  • 对不起,我的评论令人困惑;我将发布我的意思作为答案。

标签: scala types covariance


【解决方案1】:

这可能是一种好方法。

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 中通常会做的事情(将任何冲突的 types 更改为 newtypes)。

【讨论】:

    【解决方案2】:

    我有几乎相同的解决方案,我简化了 Condition 类型,添加了按名称参数调用并将映射更改为可变:

    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()
    }
    }
    

    【讨论】:

    • 你可以试试下面的代码: def b(x: => Condition) = {if (x==true) print("test")} addPair(true,new ComplexReaction( b))executeAll,但可能有一个元组或多图来存储反应会更好?
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2020-10-02
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多