Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将带标记的函数列表(记录)映射到其参数类型的记录上_Scala_Shapeless - Fatal编程技术网

Scala 将带标记的函数列表(记录)映射到其参数类型的记录上

Scala 将带标记的函数列表(记录)映射到其参数类型的记录上,scala,shapeless,Scala,Shapeless,我(实际上,这都是从我的工作示例中简化出来的)试图将一个带标签的反变函数(常量返回值,多态参数类型)列表(记录)映射到一个由这些函数的正确参数类型组成的记录上。 我知道ZipApply,这似乎适用于HLists,但我特别希望这样做,而不考虑顺序,并特别使用键类型来选择要使用的函数 下面是我的代码示例,由于我无法理解的原因,它没有编译: import shapeless._ import labelled._ import ops.hlist._ import ops.record.Selecto

我(实际上,这都是从我的工作示例中简化出来的)试图将一个带标签的反变函数(常量返回值,多态参数类型)列表(记录)映射到一个由这些函数的正确参数类型组成的记录上。 我知道ZipApply,这似乎适用于HLists,但我特别希望这样做,而不考虑顺序,并特别使用键类型来选择要使用的函数

下面是我的代码示例,由于我无法理解的原因,它没有编译:

import shapeless._
import labelled._
import ops.hlist._
import ops.record.Selector
import syntax._
import syntax.singleton._
import syntax.HListOps

object POC {
  case class Foo(bar: String)
  val gen = LabelledGeneric[Foo]
  val funs = ('bar ->> { s: String => s.toUpperCase() }) :: HNil

  val poly = new Poly1 {
    implicit def apply[K, V]
    (implicit selector: Selector.Aux[funs.type, K, (V) => String]) =
      at[FieldType[K, V]] { v => selector(funs)(v) }
  }

  def run(foo: Foo)(implicit mapper: Mapper[poly.type, gen.Repr]) =
    mapper(gen to foo)

  println(run(Foo("bar")))
  // could not find implicit value for parameter mapper: shapeless.ops.hlist.Mapper[POC.<refinement>.type,POC.gen.Repr]
}
导入无形状_
进口标签_
导入ops.hlist_
导入ops.record.Selector
导入语法_
导入syntax.singleton_
导入语法.HListOps
对象POC{
案例类Foo(条形图:字符串)
val gen=标签能量[Foo]
val funs=('bar->{s:String=>s.toUpperCase()})::HNil
val poly=新Poly1{
隐式def应用[K,V]
(隐式选择器:selector.Aux[funs.type,K,(V)=>String])=
在[FieldType[K,V]]{V=>selector(funs)(V)}
}
def运行(foo:foo)(隐式映射器:映射器[poly.type,gen.Repr])=
制图员(gen到foo)
println(run(Foo(“bar”))
//找不到参数映射器的隐式值:shapeless.ops.hlist.mapper[POC..type,POC.gen.Repr]
}

这里的问题是
poly
不是一个稳定的标识符,或者它不够稳定,或者诸如此类。以下方法可以很好地工作:

object poly extends Poly1 { ... }

我不确定我看到了比迈尔斯的评论(现在已经四年半了)更好的解释这里发生了什么。

你使用的是哪种版本的shapeless?@laugedelic 2.3.2我认为丹尼尔·斯皮瓦克在这篇演讲中为这种行为提供了一个合理的理由:(大约28岁)。简言之,这些隐式需要在伴随对象中定义,否则编译器将找不到它们。