这不能编译,我不明白为什么:
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
最佳答案
问题是你对 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
或者强制把simple类型降为
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
关于scala - 为什么在 Option[T] 的 HList 上映射不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127542/