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: _*))
}
它需要一个隐式的 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())
所以,我调用这个函数 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: _*))
}
它需要一个隐式的 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())