Scala中的存在类型

Scala中的存在类型,scala,existential-type,Scala,Existential Type,请在下面找到一个让我困惑的简短例子 我必须承认,在Scala中操纵存在类型有一些困难 如何解决第56行的类型不匹配问题? 投标人为OK类型$1,而投标人为类型$1此代码混乱。它的格式很差,混合了制表符和空格,甚至在功能解决方案不需要考虑的最琐碎的地方也使用了可变性 这项法规也不会在国际上推广到可能存在同性婚姻的国家 自上而下地工作 我怀疑你永远不会想直接实例化一个人,只想实例化一个男人或女人。所以代数数据类型更有意义,这是通过密封的trait和case类子类型实现的 我还将删除首选属性,因为它可

请在下面找到一个让我困惑的简短例子

我必须承认,在Scala中操纵存在类型有一些困难

如何解决第56行的类型不匹配问题?
投标人为OK类型$1,而投标人为类型$1此代码混乱。它的格式很差,混合了制表符和空格,甚至在功能解决方案不需要考虑的最琐碎的地方也使用了可变性

这项法规也不会在国际上推广到可能存在同性婚姻的国家

自上而下地工作

我怀疑你永远不会想直接实例化一个人,只想实例化一个男人或女人。所以代数数据类型更有意义,这是通过密封的trait和case类子类型实现的

我还将删除首选属性,因为它可能导致循环引用。在不可变数据中处理这一点超出了我在这个答案中愿意达到的水平

sealed trait Individual {
  def name: String
  override def toString(): String=name
}

//as it's a case class, `name` becomes a val,
//which implements the abstract `def name` from the trait
case class Man(name: String) extends Individual

case class Woman(name: String) extends Individual
婚姻也可以是一个案例类,让我们将类参数的笨拙复制放到VAL中——这只是毫无意义的样板文件。这也是将辅助构造函数移动到伴随对象中的工厂方法的好时机:

case class Marriage(man: Man, woman: Woman) {      
  override def toString(): String = man + "--" + woman
}
object Marriage {
  def apply(w: Woman, m: Man) = new Marriage(m,w)
}
匹配几乎是毫无意义的,整个类只是为了包装一个列表?这种事情在前泛型Java中是有意义的,但现在不再是了。无论如何,我现在将保留它,这样我就可以修复toString实现,这是一个痛苦的可变过程,并且使用return没有什么好的理由:

case class Matching(){
  private var list: List[Marriage] = Nil
  def add(m: Marriage): Unit = { list ::= m }
  override def toString() = list.mkString(" ")
}
最后是问题的症结所在。注释是内联的,但您会注意到我不需要或使用匹配。它全部被最终的印刷品所取代

这里还有更多的事情可以做,远远不止这些。同性关系呢?如果两个或两个以上的人有相同的偏好怎么办?如果某人没有偏好怎么办


我还可以将某人的偏好类型编码到各个实例中。但这已经有点高级了。

问题是什么?您能否明确地提到您在上面没有理解的内容。如何解决第56行的类型不匹配问题?有什么想法吗?你能在你的代码中注释一个协变的错误列表吗?必须优先设置一个不协变的错误列表。因此,我使用var建议者:List[Individual]=List[Individual]和proposers=proposers.filterNotp=>p==proposer。works是一个强语句,您所做的只是解决编译错误。要真正工作,它还必须是可维护的,这意味着您必须超越简单地使用推理编写Java。
case class Matching(){
  private var list: List[Marriage] = Nil
  def add(m: Marriage): Unit = { list ::= m }
  override def toString() = list.mkString(" ")
}
object Test{
  //better name, and a val (because it never changes)
  protected val menPropose = true

  def main(args: Array[String]): Unit = {

    // `new` not required for case classes
    val al      = Man("Al")
    val bob     = Man("Bob")
    val alice   = Woman("Alice")
    val barbara = Woman("Barbara")

    // remember how preference was removed from `Individual`?
    val mprefs = Map( al -> alice, bob -> barbara )
    val fprefs = Map( alice -> bob, barbara -> al )

    val men   = Set(al, bob)
    val women = Set(alice, barbara)

    // nicely immutable, and using the returned value from if/else
    val proposers = if (menPropose) men else women

    // no while loop, name shadowing, or mutability.
    // just a simple for-comprehension
    val marriages = for(proposer <- proposers) yield {
      //pattern-matching beats `isInstanceOf`... every time
      proposer match {
        case m: Man => Marriage(m, mprefs(m))
        case f: Woman => Marriage(f, fprefs(f))
      }
    }

    println(marriages mkString " ")
  }
}