作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下问题,我想将一个 HList 的项目映射到另一个 HList,但是如果“目标”类型是 URL,源 HList 中的字符串应该只转换为 URL。
val name = "Stackoverflow"
val url = "https://stackoverflow.com/q"
val list = name :: url :: HNil
val mapped: String :: URL :: HNil = list.map(???)
最佳答案
我不认为你会得到你想要的东西,因为 Scala 的隐式解析发生在类型推断之前(但谁知道呢——人们总是在 Scala 中做让我感到惊讶的事情)。
(旁注: CanBuildFrom
/ breakOut
模式支持与您要求的类似的东西,但我没有看到在这种情况下使其工作的方法,因为源类型确实限制了哪些实例可用.)
不过,对于这种情况,有一个非常标准的解决方法,包括使用辅助类来近似部分应用类型参数。假设您有一个相当简单的类型类来捕获您的转换逻辑:
import java.net.URL
import shapeless._
trait Convert[I <: HList, O <: HList] { def apply(i: I): O }
object Convert extends LowPriorityConvertInstances {
implicit val convertHNil: Convert[HNil, HNil] = new Convert[HNil, HNil] {
def apply(i: HNil): HNil = i
}
implicit def convertHConsURL[T <: HList, TO <: HList](implicit
c: Convert[T, TO]
): Convert[String :: T, URL :: TO] = new Convert[String :: T, URL :: TO] {
def apply(i: String :: T): URL :: TO = new URL(i.head) :: c(i.tail)
}
}
sealed class LowPriorityConvertInstances {
implicit def convertHCons[H, T <: HList, TO <: HList](implicit
c: Convert[T, TO]
): Convert[H :: T, H :: TO] = new Convert[H :: T, H :: TO] {
def apply(i: H :: T): H :: TO = i.head :: c(i.tail)
}
}
def convert[I <: HList, O <: HList](i: I)(implicit c: Convert[I, O]): O = c(i)
class PartiallyAppliedConvert[O <: HList] {
def apply[I <: HList](i: I)(implicit c: Convert[I, O]): O = c(i)
}
def convert[O <: HList]: PartiallyAppliedConvert[O] =
new PartiallyAppliedConvert[O]
scala> val mapped = convert[String :: URL :: HNil](list)
mapped: shapeless.::[String,shapeless.::[java.net.URL,shapeless.HNil]] = Stackoverflow :: https://stackoverflow.com/q :: HNil
关于scala - 取决于目标类型的无形 map HList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36515901/
我是一名优秀的程序员,十分优秀!