我尝试定义自定义列表,就像内置的<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]
?
答案 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
; A
到Traversable[B]
的隐式转换。此转换将应用于MyList.fromTraversable
。