MyList.flatten 最简单的定义是什么
What's the simplest definition of a MyList.flatten
我正在尝试定义一个自定义列表,它类似于内置的 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]
但不知道如何实现,甚至不确定是否正确。
如何制作自定义列表flatten
可以用最简单的定义?
最简单的方法可能是在某个地方定义一个方法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
:
- 使得在
Traversable
的 MyList
以外的任何对象上调用 flatten
成为编译错误;
- 提供从
A
到 Traversable[B]
的隐式转换。此转换应用于 MyList.fromTraversable
. 的参数
我正在尝试定义一个自定义列表,它类似于内置的 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]
但不知道如何实现,甚至不确定是否正确。
如何制作自定义列表flatten
可以用最简单的定义?
最简单的方法可能是在某个地方定义一个方法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
:
- 使得在
Traversable
的MyList
以外的任何对象上调用flatten
成为编译错误; - 提供从
A
到Traversable[B]
的隐式转换。此转换应用于MyList.fromTraversable
. 的参数