Почему отображение по HList Option[T] не работает?

Это не компилируется и я не понимаю почему:

import shapeless._
import poly._

object option extends (Option ~> List) {
    def apply[T](t: Option[T]) = t.toList
}

val simple = Some(1) :: Some("hello") :: Some(true) :: HNil
val opts: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option

Это несколько удивительно, потому что это компилируется:

import shapeless._
import poly._

object choose extends (Set ~> Option) {
    def apply[T](s: Set[T]) = s.headOption
}

val sets = Set(1) :: Set("foo") :: HNil
val opts: Option[Int] :: Option[String] :: HNil = sets map choose

1 ответ

Решение

Проблема в том, что вы используете Some вместо Option, Компилятор жалуется, что не может найти ничего, чтобы преобразовать список Someхотя ваш Option картограф используется. Чтобы это исправить, вы можете:

Измените свою простую конструкцию списка, чтобы использовать Option вместо Some:

  object option extends (Option ~> List) {
    def apply[T](t: Option[T]) = t.toList
  }

  val simple = Option(1) :: Option("hello") :: Option(true) :: HNil
  val opts2: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option

использование Some как тип вашего картографа:

  object option extends (Some ~> List) {
    def apply[T](t: Some[T]) = t.toList
  }

  val simple = Some(1) :: Some("hello") :: Some(true) :: HNil
  val opts2: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option

Или заставить тип простого быть опущенным до Option:

  object option extends (Option ~> List) {
    def apply[T](t: Option[T]) = t.toList
  }

  val simple: Option[Int] :: Option[String] :: Option[Boolean] :: HNil = Some(1) :: Some("hello") :: Some(true) :: HNil
  val opts2: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option
Другие вопросы по тегам