scala - 为什么在 Option[T] 的 HList 上映射不起作用?

标签 scala mapping shapeless hlist

这不能编译,我不明白为什么:

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/

相关文章:

scala - 给定 A::B::C 和 (A, B, C) => D,如何写 A::B::C => D?

scala - 无形:Generic.Aux

scala - sbt 使用的默认 scalaVersion 在哪里?

scala - Spark 流文件流

mysql - 如何在Akka Actor中使用MYSQL jdbc实现

javascript - Sails.js - 一对多映射

eclipse - 非法参数异常 : The servlets named [HelloWorlds] and [Hello] are both mapped to the url-pattern [/sHelloWorld] which is not permitted

java - Hibernate通过java注释将java中的嵌套集合映射到映射表?

design-patterns - 具有函数式编程的链接对象?

scala - 带标记类型的解码案例类