Shapeless 和 gremlin scala:如何返回调用 `as` 的结果?

2024-06-20

所以,我调用这个函数as (from 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 https://github.com/mpollmeier/gremlin-scala/blob/master/gremlin-scala/src/main/scala/gremlin/scala/GremlinScala.scala#L239

它需要一个隐式的 Prepend 参数,我不确定我是否理解它。我知道gremlin-scala使用其 HList 来跟踪查询中的哪些点as被调用,以便稍后当select被称为它知道要返回遍历中的哪些点。

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

这在一般代码中工作得很好,但现在我想编写一个调用的函数as并返回其结果。这就是我陷入困境的地方:这个函数的返回值的签名是什么?

最后,我在我的函数中添加了一个隐式参数,但我担心我只是将问题提升了一个层次。这是我到目前为止所拥有的:

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]]

如何编写一个返回结果的函数as,它的签名是什么?

Thanks!


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

So the 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())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shapeless 和 gremlin scala:如何返回调用 `as` 的结果? 的相关文章

随机推荐