当我有这样的通用类时
case class C [E] (errors : Seq[E]){
def merge [E1 <: EX, EX >: E] (errors1 : Seq[E1]) = Seq[EX]() ++ errors ++ errors1
}
一切正常 - 它将错误序列合并为一系列常见超类型。但是,当我将它与类型类模式混合时,它不会正确推断出公共超类型。
我已经根据这种方法实现了 HList 应用程序,它可以自行工作。现在我想用它来构建每个参数都可能失败的参数列表。最后,我希望能够将此参数列表应用于可能会失败的函数。所以输出错误序列类型应该是列表错误和函数错误的超类型。(下一步将取消函数必须返回 ErrorProne 并通过某些类型类将其展平的限制,但我认为这是一个更简单的情况。)失败的参数列表包装器是这样的。请注意 :: 方法有效。
case class SuccessArgList [E, L <: HList[L]] (list : L) extends ArgList[E, L] {
override def apply[S, E1 <: EX, EX >: E, F](fun : F)(implicit app : HApply[L, F, ErrorProne[E1, S]])
: ErrorProne[EX, S] = app.apply(list, fun)
override def :: [A, E1 <: EX, EX >: E] (argument : ErrorProne[E1, A]) : ArgList[EX, A :: L] = argument match {
case Success(a) => SuccessArgList(a :: list)
case Failure(e) => FailureArgList(e)
}
}
其中 E 是当前失败参数列表的错误类型,L 是实际参数列表的类型,S 是函数成功值类型,E1 是函数失败值类型,EX 应该是错误的常见超类型,F 是功能。失败列表类似,ErrorProne 容器是这样的(我可能会使用 Either,但这不应该是相关的)
sealed trait ErrorProne[+F, +S]{
def f[To] (implicit flatrener : FlattenErrorProne[ErrorProne[F, S], To]) = flatrener.flatten(this)
}
case class Success [+F, +S] (result : S) extends ErrorProne[F, S]
case class Failure [+F, +S] (errors : Seq[F]) extends ErrorProne[F, S]
当尝试使用参数列表类型参数的 apply 方法时,推断错误确定 E1 到 E,因此找不到应用程序。推理可以修复吗?是否有关于推论所依据的规则的材料?我找不到任何规格。