У меня есть следующий код:Scala, проблема несоответствие типов и определение типа проблема
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"
Edit: (больше объяснений)
Predicate класс является классом с функцией «Func», который может получить переменное число аргументов. Я реализовал это, используя вопрос, который я задал ранее (ссылка есть) Я могу создать экземпляр из предиката, p1 и p2. У меня есть еще один класс «SimplePlan», который имеет член графа, который я хочу, чтобы его узлы были Predicate. Но поскольку я использую определение HList в определении Predicate, типы каждого из них различаются. Тип каждого 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 Я добавил несколько подробностей и ошибок. Извините, я действительно не знал, какую часть я должен удалить, чтобы сделать его более понятным, но я надеюсь, что добавленная часть может его прояснить. – Omid
Это выглядит из [здесь] (http://www.scala-graph.org/api/core/api/index.html#scalax.collection.edge.Implicits$$LDiEdgeAssoc) и сообщение об ошибке, которое вы получаете LUB «Arg :: HNil» и «Arg :: Arg :: HNil», что не имеет ничего общего. Что вы ожидаете от 'SimplePlan'? –