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:

  • 使得在 TraversableMyList 以外的任何对象上调用 flatten 成为编译错误;
  • 提供从 ATraversable[B] 的隐式转换。此转换应用于 MyList.fromTraversable.
  • 的参数