【问题标题】:Shapeless and gremlin scala: How do I return the result of a call to `as`?Shapeless and gremlin scala:我如何返回调用`as`的结果?
【发布时间】:2016-11-16 16:02:43
【问题描述】:

所以,我调用这个函数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 时它知道遍历中要返回哪些点。

这是关键: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结果的函数,它的签名是什么?

谢谢!

【问题讨论】:

    标签: scala gremlin shapeless


    【解决方案1】:

    正如您正确解释的那样,我们使用 prepend 的原因是为了保留标有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())
    

    【讨论】:

    • 你是对的!这确实可以编译和工作。事实证明我的问题要高一个级别,我在 RightFold 中使用 Poly2 来应用一系列这样的操作。我将针对这个问题提出一个新问题,谢谢您的回答! (顺便说一下,我喜欢 gremlin-scala,感谢您的写作:)
    • 好的,这里有新问题:stackoverflow.com/questions/40754229/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2014-01-25
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多