【问题标题】:Shapeless zipWithKeys: Could not find implicit parameterShapeless zipWithKeys:找不到隐式参数
【发布时间】:2017-12-08 06:26:22
【问题描述】:

我最近一直在玩 shapeless。有一个非常基本的东西我无法理解:

import shapeless._
import syntax.singleton._
import record._

object NotWorking {
  val result = ("value" :: HNil).zipWithKeys("key" :: HNil)
} 

我希望这个 sn-p 输出一个可扩展的记录。但是编译器无法找到 withKeys 的隐式:

could not find implicit value for parameter withKeys: shapeless.ops.hlist.ZipWithKeys[shapeless.::[String,shapeless.HNil],shapeless.::[String,shapeless.HNil]]
[error]     ("value" :: HNil).zipWithKeys("key" :: HNil)

这更令人困惑,因为我从 Shapeless 的测试用例中提取的示例完美运行:

import shapeless._
import syntax.singleton._
import record._

object ShamelesslyStolenFromTests {
  val orig =
    ("intField" ->> 1) ::
    ("boolField" ->> true) ::
    HNil

  val result = orig.values.zipWithKeys(orig.keys)
}

我错过了什么?

【问题讨论】:

  • 你的进口是什么?
  • 嗨@GáborBakos,请参阅更新后的问题:)

标签: scala shapeless hlist


【解决方案1】:

以下代码编译:

  import shapeless._
  import syntax.singleton._
  import record._

  object FinallyWorking {
    val result = ("value" :: HNil).zipWithKeys[Witness.`"key"`.T :: HNil]("key".narrow :: HNil)
  }

所以这似乎是方法类型参数的类型推断问题。

【讨论】:

  • 非常感谢您的回答!你知道zipWithKeys 是否真的打算这样使用吗?我觉得必须有一个更直接的方法。这可能是无形中的错误吗?
  • 这绝对不是shapeless的bug。这是编译器使用的类型推断算法的限制。您可以使用zipWithKeys 的重载版本:("value" :: HNil).zipWithKeys[Witness.`"key"`.T :: HNil]。这可以避免一些代码重复。这个zipWithKeys 在类型级别上工作,而不是第一个zipWithKeys 在类型和值级别上工作。
  • 它开始变得有意义了。谢谢! val result = ("value" :: HNil).zipWithKeys[HList.`"key"`.T] 更简洁一些。
猜你喜欢
  • 2018-10-25
  • 2016-02-17
  • 2016-01-17
  • 2017-02-02
  • 2015-12-23
  • 2011-10-17
  • 2016-03-31
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多