Я пытаюсь определить пользовательский список, который, как встроенный List[+A]
, но гораздо проще:Что самое простое определение MyList.flatten
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
в состоянии простейшей защиты?
Подумайте, как вы хотите, чтобы Flatten действовал, в случае, когда тип списка не является чем-то, что имеет смысл сгладить. например что произойдет, если вы назовете «List [Int] .flatten'? – mattinbits
@mattinbits В этой проблеме я не могу справиться. Не обязательно делать это только «flatten'able для« List [T [_]] ', где« T »является обходной – Freewind
Для обычного списка scala вы получаете ошибку времени компиляции для« List (1,2,3) .flatten' Если вы ищете более простой подход, вы можете сделать это исключение во время выполнения и проверить, является ли тип вашего списка Traversable при вызове сглаживания. Тогда вам не нужен GenTraversableOnce в подписи – mattinbits