【问题标题】:Shapeless : Prepend. Implicit not found无形:前置。未找到隐式
【发布时间】:2012-06-26 20:40:40
【问题描述】:

我正在尝试使用 shapeless 以类型安全的方式轻松累积对象。

问题是当我想连接 (:::) 两个 HList 时。我遇到了一个新手(至少看起来)问题。它错过了上下文中的 Prepend 隐式实例。

但是,查看hlist.scala,我可以看到在对象PrependPrependAux 中定义了通用implicit def

手动添加import Prependimport PrependAux 并没有改变任何东西(显然......)。

所以这里的代码减少到最少:

enter code here

import shapeless._
import HList._
import Prepend._
import PrependAux._

object test {

  val a:HList = 1 :: 4 :: "A" :: HNil
  val b:HList = "R" :: false :: HNil

  val c:HList = a ::: b   // <<<<<<<<<<< NEEDS A Prepend in the context 

}

现在在控制台中:

[error]     test.scala:10: could not find implicit value for parameter prepend: shapeless.Prepend[shapeless.HList,shapeless.HList]
[error]     val c:HList = a ::: b   // this needs an implicit Prepend in the current context

什么会烫伤我的眼睛?

谢谢

编辑

稍微更新一下,把真正的问题重新复杂化了一点,因为以前粗俗化太强了。

这是我能做的事情:

case class A[L<:HList](a:L) { 
  def doSmth[C <:HList](c:C) = a ::: c 
}

所以我无法访问真正的类型,只有我知道它们是 HList s。

【问题讨论】:

  • 唯一的答案也已更新。它仍然有效。显然,我的解决方案中缺少的东西是 scalac 选项......

标签: scala functional-programming shapeless


【解决方案1】:

HList 的向上转换是这里的问题。对于普通的旧 HList,您几乎无能为力(除了向其添加新元素)。

您可以提供更多信息的类型注释:

val a: Int :: Int :: String :: HNil = 1 :: 4 :: "A" :: HNil
val b: String :: Boolean :: HNil = "R" :: false :: HNil
val c: Int :: Int :: String :: String :: Boolean :: HNil = a ::: b

或者只是让类型被推断出来,这通常更方便:

val a = 1 :: 4 :: "A" :: HNil
val b = "R" :: false :: HNil
val c = a ::: b

回复您的评论:如果您确保获得所需的证据,您可以做任何您想做的事(请注意,我假设 a: Aa: L 的拼写错误,并且您需要-Ydependent-method-types 才能工作):

case class A[L <: HList](a: L) {
  def doSmth[C <: HList](c: C)(implicit p: Prepend[L, C]) = a ::: c
}

一般而言,您可以只查看您正在使用的操作所必需的隐式,然后将它们包含在您的方法中。

【讨论】:

  • 谢谢,你说得完全正确(所以我当然验证了)。实际上我的例子已经减少了太多的问题。因为我的问题在于那种东西(减少了一点):case class A[L&lt;:HList](a:A) { def doSmth[C &lt;:HList](c:C) = a ::: c }。怎么想?
  • 你的错字是对的!对于那个很抱歉。感谢更新(我也会更新问题)。实际上我做到了,并且可能我需要你所说的选项才能让这个工作。再次感谢,我会尽快尝试。
  • 它工作.. 我已经放了 scalac 选项,并且在某些情况下定义了 HList 的“形状”是什么,现在可以工作了。 THX
猜你喜欢
  • 1970-01-01
  • 2014-07-06
  • 2015-12-23
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多