什么是MyList.flatten最简单的定义

时间:2015-08-07 14:52:52

标签: list scala implicit flatten

我尝试定义自定义列表,就像内置的<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div> <div id="user"> <div>John Smith, premium user</div> </div> <div class="post"> <div> <div id="postTitle" class="postTitle">This is a really long long long title with lot of contents ... fgdsfgdfgdsfgdsfgdfgg dsdfgsdfgdfgdsfgfg dfsdfgdsfgdsfgdfg dsf gsdfgsdfgdsfgdfhdfghdfgdfghfdghfghsfgdfsgsdfgdsfgdsgdsf</div> <div class="postContent">gsdfgdsfgdfsgdfsgdsfg</div> <div class="reply"><a>Reply</a> </div> </div> </div> </div>一样,但更简单:

List[+A]

问题是我不确定如何定义sealed trait MyList[+A] { def flatMap[B](f: A => MyList[B]): MyList[B] def map[B](f: A => B): MyList[B] def flatten[B](implicit asTraversable: A => GenTraversableOnce[B]): MyList[B] } case object MyNil extends MyList[Nothing] { override def flatMap[B](f: (Nothing) => MyList[B]): MyList[B] = ??? override def flatten[B](implicit asTraversable: (Nothing) => GenTraversableOnce[B]): MyList[B] = ??? } case class MyCons[A](head: A, tail: MyList[A]) extends MyList[A] { override def flatMap[B](f: (A) => MyList[B]): MyList[B] = ??? override def flatten[B](implicit asTraversable: (A) => GenTraversableOnce[B]): MyList[B] = ??? } 方法。我从某处复制了隐含值flatten

asTraversable

但不确定如何实施,甚至不确定它是否正确。

如何使用最简单的定义来制作自定义列表def flatten[B](implicit asTraversable: A => GenTraversableOnce[B]): MyList[B]

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是在某处定义一个方法fromTraversable,也许在伴随对象中:

object MyList {
  def fromTraversable[T](t: Traversable[T]): MyList[T] = 
    if (t.isEmpty) MyNil 
    else MyCons(t.head, fromTraversable(t.tail)) 
}

此方法通常可用于列表实现。

然后flatten只是对flatMap的调用(当然,您需要实现flatMap):

sealed trait MyList[+A] {
  def flatMap[B](f: A => MyList[B]): MyList[B] = ???
  def flatten[B](implicit ev: A <:< Traversable[B]): MyList[B] = 
    flatMap(MyList.fromTraversable(_))
}

隐式参数ev

  • 将此编译错误称为flatten MyList以外的任何内容Traversable;
  • 提供从ATraversable[B]的隐式转换。此转换将应用于MyList.fromTraversable
  • 的参数