所以,我调用这个函数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!