Scala,类型不匹配问题和类型推断问题

Scala,类型不匹配问题和类型推断问题,scala,shapeless,Scala,Shapeless,我有以下代码: import shapeless._ trait TypeLike case class Arg(name:String) case class Predicate[Args <: HList, O <: TypeLike](name: String,args:Args,output:O,func: Args => O)(implicit val lubWitness: LUBConstraint[Args, Arg]) object testMe ext

我有以下代码:

import shapeless._
trait TypeLike

case class Arg(name:String)

case class Predicate[Args <: HList, O <: TypeLike](name: String,args:Args,output:O,func: Args => O)(implicit val lubWitness: LUBConstraint[Args, Arg])
object testMe extends App{
  val p1 = Predicate("Example1", Arg("test")::Arg("test")::HNil, new TypeLike {},
    (args: Arg ::Arg:: HNil) => { println(args(0));new TypeLike {} })


  val p2 = Predicate("Example2", Arg("test")::HNil, new TypeLike {},
    (args: Arg :: HNil) => { println(args(0));new TypeLike {} })

  val x = Graph((p1 ~+> p2)("booo"))
  val p = SimplePlan(x)
}
为了解决这个问题,我到底需要补充什么? 如果您希望具有依赖项:

scalaVersion := "2.10.4"

libraryDependencies += "com.assembla.scala-incubator" %% "graph-core" % "1.9.1"

libraryDependencies += "com.chuusai" % "shapeless_2.10.4" % "2.1.0"
编辑:(更多解释)

谓词类是一个具有函数“func”的类,该函数可以获取可变数量的参数。我使用我之前提出的问题实现了这一点(链接在那里) 我现在可以从谓词中实例化,p1p2。我有另一个类“SimplePlan”,它有一个图的成员,我希望它的节点是谓词。但因为我在谓词定义中使用HList,所以每个p1p2的类型都是不同的。我在以下位置收到类型不匹配错误:

val p = SimplePlan(x)
我真的不知道,我应该如何定义SimplePlan来解决这个问题。确切的错误是:

Error: inferred type arguments [Nothing,Nothing,Planner.Predicate[_ >: shapeless.::[Planner.Arg,shapeless.HNil] with shapeless.::[Planner.Arg,shapeless.::[Planner.Arg,shapeless.HNil]] <: shapeless.::[Planner.Arg,shapeless.HList], Planner.TypeLike]] do not conform to method apply's type parameter bounds [A <: shapeless.HList,B <: Planner.TypeLike,N <: Planner.Predicate[A,B]]
  val p = SimplePlan(x)
          ^

Error: type mismatch;
 found   : scalax.collection.immutable.Graph[Planner.Predicate[_ >: shapeless.::[Planner.Arg,shapeless.HNil] with shapeless.::[Planner.Arg,shapeless.::[Planner.Arg,shapeless.HNil]] <: shapeless.::[Planner.Arg,shapeless.HList], Planner.TypeLike],scalax.collection.edge.LDiEdge]
 required: scalax.collection.immutable.Graph[N,scalax.collection.edge.LDiEdge]
  val p = SimplePlan(x)
                     ^

错误:推断类型参数[Nothing,Nothing,Planner.Predicate[\u>:shapeless.:[Planner.Arg,shapeless.HNil]与shapeless.:[Planner.Arg,shapeless.HNil]]在处理无形状列表时,您遇到了一个常见问题:每个HList都有不同的类型,要想在没有考虑HList概念的代码中不丢失这些类型是非常棘手的

您构建了两个谓词,一个是谓词[Arg::Arg::Nil,TypeLike],另一个是谓词[Arg::Nil,TypeLike]

图形的定义如下所示:

trait Graph[N, E[X] <: EdgeLikeIn[X]]
如果我不指定类型,它就会失败:Scala类型推断有其局限性。这也不是您想要做的,因为您不希望所有谓词都具有相同的形状


我们可以通过在SimplePlan的定义中更具体一点来进行类型推断。因为您只有一个谓词类型,所以很难知道您在这里要做什么。您能将此最小化并提供实际的错误消息吗。@TravisBrown我添加了一些详细信息和错误。对不起,我真的不知道是哪一个谓词类型rt我应该删除以使其更清楚,但我希望添加的部分可以澄清它。它看起来和错误消息表明,您得到了
Arg::HNil
Arg::Arg::HNil
,这没有任何意义。对于
SimplePlan
,您希望推断出什么e> Arg::HNil
和'Arg::Arg::HNil`都
是的,它们都是
HList
s,但是对于一个普通的
HList
,你几乎无能为力。感谢你的关注,我添加了另一个摘要,如果你有任何问题,请告诉我,根据你所说的,在我看来,你将不得不接受丢失类型的信息然后在图形执行中使用反射。您使用反射的方式是什么?
trait Graph[N, E[X] <: EdgeLikeIn[X]]
val x = Graph((p1 ~+> p1)("booo")) 
val p = SimplePlan[Arg::Arg::HNil,
          TypeLike,Predicate[Arg::Arg::HNil,TypeLike]](x)
case class SimplePlan[A<:HList, B<:TypeLike](plan:Graph[Predicate[A,B],LDiEdge])
val x = Graph((p1 ~+> p1)("booo"))
val p = SimplePlan(x)