gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:58:06 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com