簡體   English   中英

Scala中的現有類型

[英]Existential types in Scala

請在下面找到一個使我感到困惑的簡短示例。

我必須承認,在Scala中操縱存在類型存在一些困難。

我應該如何解決類型不匹配的第56行? 提議者可以__1類型,而提議者可以__1類型<:個人

提前致謝,

馬克西姆

class Individual(n: String) {
  protected val name=n
  var preferred: Individual = this
  override def toString(): String=name
}

class Man(n: String) extends Individual(n) { }

class Woman(n: String) extends Individual(n) { }

class Marriage(m: Man, w: Woman){
  private val man=m
  private val woman=w
  def this(w: Woman, m: Man) = this(m,w)
  override def toString(): String = man+"--"+woman
}

class Matching(){
  private var list: List[Marriage] = Nil
  def add(m: Marriage): Unit = { list = m ::list }
  override def toString(): String= {
    var s: String = ""
    for (elm<-list) s=s+elm+" "
    return s
  }
}

object Test{
  protected var male = true

  def main(args: Array[String]): Unit = {
    val al      = new Man("Al")
    val bob     = new Man("Bob")
    val alice   = new Woman("Alice")
    val barbara = new Woman("Barbara")

    al.preferred      = alice
    bob.preferred     = barbara
    alice.preferred   = bob
    barbara.preferred = al

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

    val m = new Matching()
    //var proposers=women

    var proposers: Set[_ <:Individual] = Set[Individual]()
    if (male) proposers = men
    else proposers = women

    while (!proposers.isEmpty) {
      for(proposer <- proposers) {
        val proposer=proposers.head
        if (proposer.isInstanceOf[Man])
          m.add(new Marriage(
            proposer.asInstanceOf[Man],
            proposer.preferred.asInstanceOf[Woman]
          )) 
        else 
          m.add(new Marriage(
            proposer.asInstanceOf[Woman],
            proposer.preferred.asInstanceOf[Man]
          ))
        proposers-=proposer//There is an error here
      } 
    }

    println(m)
  }
}

這段代碼很亂。 它的格式不正確,混合了制表符和空格,即使在功能解決方案幾乎不需要思考的最瑣碎的地方,它也使用可變性。

該法規也無法在國際上推廣到可能發生同性婚姻的國家。

從上到下工作...

我懷疑您永遠都不想直接實例化一個Individual ,只是一個Man或一個Woman 因此,代數數據類型更有意義,這是通過sealed traitcase class子類型完成的。

我還將刪除preferred屬性,因為它可能導致循環引用。 處理不可變數據超出了我在這個答案中願意達到的水平。

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

Marriage也可以是一個案例類,讓我們將類參數的笨拙重復放入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)
}

Matching幾乎沒有意義,整個類只是包裝一個List 在前泛型Java中,這種事情很有意義,但現在已經不復存在了。 我仍將保留它(暫時),以便我可以修復該toString實現,該實現很痛苦地易變,並且沒有充分的理由使用return

case class Matching(){
  private var list: List[Marriage] = Nil
  def add(m: Marriage): Unit = { list ::= m }
  override def toString() = list.mkString(" ")
}

最后是“肉”的問題。 評論是內聯的,但您會注意到我不需要(或使用) Matching 最后的println完全取代了它

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

還有更多可以在這里完成的方法。 什么是同性關系? 如果兩個或兩個以上的人擁有相同的偏好怎么辦? 如果某人沒有偏好怎么辦?

我還可以將某人的偏好類型編碼為Individual實例。 但這已經變得更加先進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM