【发布时间】:2015-04-17 01:20:32
【问题描述】:
我有以下代码:
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])
(这是来自Here 的问题的结果) 我想拥有:
import scalax.collection.edge.LDiEdge
import scalax.collection.immutable.Graph
import scalax.collection.edge.Implicits._
import shapeless._
case class SimplePlan[A<:HList,B<:TypeLike,N<:Predicate[A,B]](plan:Graph[N,LDiEdge])
以下代码出现类型不匹配和推断类型参数错误:
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”的类,该函数可以获取可变数量的参数。我使用我之前提出的问题实现了这一点(链接在那里) 我现在可以从谓词 p1 和 p2 实例化。我有另一个类“SimplePlan”,它有一个图的成员,我希望它的节点是一个谓词。但是因为我在 Predicate 定义中使用 HList,每个 p1 和 p2 的类型是不同的。我收到类型不匹配错误:
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)
^
Edit 2(解释我到底想要什么): 我的研究项目需要这个,所以我想做的可能有点奇怪。我想要一个谓词类,其中包含一个具有不同数量和类型参数的函数。我想要一个图(这是我的执行图)。我可以摆脱 HList 的参数,但我会丢失类型信息!
【问题讨论】:
-
很难说你想在这里做什么。您能否将其最小化并提供实际的错误消息。
-
@TravisBrown 我添加了更多细节和错误。对不起,我真的不知道应该删除哪个部分才能更清楚,但我希望添加的部分能够澄清它。
-
从here 和错误消息中可以看出,您正在获取
Arg :: HNil和Arg :: Arg :: HNil的LUB,这没有任何意义。SimplePlan你期望推断出什么A? -
@TravisBrown 是
Arg:: HNil和 'Arg::Arg::HNil` 都是<: HList吗?我想要一个SimplePlan的类型,它允许任何类型的Predicate?我什至不知道当我的班级成员中有一个 HList 时是否有可能 -
是的,他们都是
HLists,但是对于普通的HList,您几乎无能为力。