Shapeless 和 gremlin scala:如何 return 调用 as 的结果?

Shapeless and gremlin scala: How do I return the result of a call to `as`?

所以,我调用这个函数 as(来自 gremlin-scala):

case class GremlinScala[End, Labels <: HList](traversal: GraphTraversal[_, End]) {
  def as(name: String, moreNames: String*)(implicit p: Prepend[Labels, End :: HNil]) =
    GremlinScala[End, p.Out](traversal.as(name, moreNames: _*))
}

这里定义:https://github.com/mpollmeier/gremlin-scala/blob/master/gremlin-scala/src/main/scala/gremlin/scala/GremlinScala.scala#L239

它需要一个隐式的 Prepend 参数,我不确定我是否理解它。我知道 gremlin-scala 使用它的 HList 来跟踪调用查询 as 中的哪些点,以便稍后在调用 select 时它知道遍历到 [=41 的哪些点=].

这是关键:as 附加到该 HList。或明显前置,视情况而定。

这在一般代码中工作正常,但现在我想编写一个调用 as 和 return 其结果的函数。这就是我卡住的地方:这个函数的 return 值的签名是什么?

最后,我在我的函数中添加了一个隐式参数,但我担心我只是把问题追上了一个层次。这是我目前所拥有的:

case class AsOperation[A, In <: HList](step: String) extends Operation {
  def operate(g: GremlinScala[A, In]) (implicit p: Prepend[In, ::[A, HNil]]): GremlinScala[A, p.Out] = {
    g.as(step)
  }
}

这样就可以编译了,但是我还是不能使用这个功能!每当我调用它时,它都会向我抱怨

could not find implicit value for parameter p: shapeless.ops.hlist.Prepend[In,shapeless.::[A,shapeless.HNil]]

如何编写 return 是 as 结果的函数,它的签名是什么?

谢谢!

正如您正确解释的那样,我们使用前缀的原因是为了保留标有 as 的步骤的类型。它使它们保持相反的顺序,因为它更容易在两侧进行处理:用于捕获和重放。

所以 implicit p: Prepend[Labels, End :: HNil] 在当前步骤中预先设置类型,以便我们在第二个类型参数中捕获它(并且可以在后面的步骤中使用它,例如 select)。

据我所知,你做的是正确的,而且它确实有效......无论如何对我来说:)

这样编译:

import gremlin.scala._
import shapeless.{HNil, ::}
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory
def graph = TinkerFactory.createModern.asScala
val gs1: GremlinScala[Vertex, Vertex :: HNil] = graph.V().as("a")
val gs2: GremlinScala[Vertex, Vertex :: HNil] = AsOperation("someLabel").operate(graph.V())