无形和精怪阶:我如何返回`as`呼叫的结果呢?(Shapeless and gremlin scal

2019-09-29 19:10发布

因此,我调用这个函数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

这需要一个隐含的前置说法,这我不知道我的理解。 我知道, 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 ,什么是它的签名?

谢谢!

Answer 1:

当你正确地说明,我们用预先准备的原因是为了保持类型的标记有步骤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())


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