类型参数化

第19章

queue函数队列

head:返回队列第一个元素;tail 返回除第一个元素之外的队列;append返回尾部添加了指定元素的新队列

class SlowAppendShow[T](elems: List[T]) {
  def head = elems.head
  def tail = new SlowAppendShow(elems.tail)
  def append(x: T) = new SlowAppendShow(elems::: List(x))
}

2种表达方式效率都不高

class SlowAppendShow1[T](smele: List[T]) {
  def head = smele.last
  def tail = new SlowAppendShow1(smele.init)
  def append(x: T) = new SlowAppendShow1(x:: smele)
}

 高效率的解决办法:

class Queue[T]{
  private val leading: List[T] = Nil
  private val tariling: List[T] = Nil
  private def mirror = {
      if (leading.isEmpty)
          new Queue{tariling.reverse}
      else
       this

    def head = mirror.leading.head

    def tail = {
      val q = mirror
      new Queue(q.leading.tail, q.tariling)
    }

    def append(x: T) =
      new Queue(leading, x:: tariling)
  }
}

 最终解决方案

trait Queue[T] {
  def head: T
  def tail :Queue[T]
  def append(x: T):Queue[T]
}
object Queue{
  def apply[T](xs: T*): Queue[T] =
    new QueuImpml[T](xs.toList, Nil)

  private class QueueImpl[T](
    private val leading: List[T] = Nil,
    private val tarining: List[T] = Nil
    ) extends Queue[T] {
      def mirror =
        if(leading.isEmpty)
            new QueueImpl[T](tarining.reverse, Nil)
            else
          this
     def head : T = mirror.leading.head
     def tail: QueueImpl[T] = {
       val q = mirror
       new QueueImpl[T](q.leading.tail, q.tarining)
     }
    def append(x: T) = 
      new QueueImpl[T](leading, x:: tarining)
  }
}

变化型注解:

下界:

原文地址:https://www.cnblogs.com/zhanggl/p/4986145.html