繁体   English   中英

种类不符合lambda类型

[英]Kinds not conforming with type lambda

遇到类型“种类”的问题:

trait Sys[ S <: Sys[S]]
trait Expr[S <: Sys[S], A]
trait Attr[S <: Sys[S], A[_]]
def test[  S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???

这失败了

error: kinds of the type arguments (S,[x <: Sys[x]]Expr[x,Int]) do not conform
to the expected kinds of the type parameters (type S,type A) in trait Attr.
[x <: Sys[x]]Expr[x,Int]'s type parameters do not match type A's expected parameters:
type x's bounds <: Sys[x] are stricter than type _'s declared bounds >: Nothing <: Any
           def test[S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???
                                  ^

声明的边界有什么问题? 我是否需要将cr * ppy部分应用的类型带入trait Attr的类型构造函数中? 为什么? 我可以在不触及Attr定义的情况下解决这个问题吗?

我需要的功能边界test ,以便实施工作,但我不想增殖这些边界的公共接口Attr


注意 :如果我使用类型成员 (我不想要的),它可以工作:

trait Attr[S <: Sys[S]] { type A[_]}
def test[  S <: Sys[S]]: Attr[S] { type A[S <: Sys[S]] = Expr[S, Int]} = ???

正如您所观察到的,在提供更高级别的类型参数时,您不能总是不匹配边界。 有趣的是,它实际上是一个方差问题:

class A
class B extends A
trait NeedsNeedsA[T[S <: A]]
trait NeedsNeedsB[T[S <: B]]
trait NeedsA[S <: A]
trait NeedsB[S <: B]

def x: NeedsNeedsA[NeedsB] // fails
def y: NeedsNeedsB[NeedsA] // works

如果你认为一个高级的类型作为一个类型的函数,它的论证的界限是逆变的,这是有道理的。

有趣的是,在结构类型中,表面很像子类型,Scala不会给出相同的错误:

def t: MemberNeedsA { type T[S <: B] }
def u: MemberNeedsB { type T[S <: A] }

原因是结构类型有点像交叉点:

def s: MemberNeedsA with MemberNeedsB

并且可能是交叉点实际上不存在于自然界中,但Scala不会检查它。

好的,但这与你的问题不太相关。 回到你的问题:我认为你有一个差异问题。 你希望test给调用者一个Attr ,而一个Attr拥有一个类型函数( A[_] ),你想说, 这个 Attr有一个需要更具体参数的类型函数。 我认为你可以理解为什么你不应该被允许这样做 - 这就是你不能用一个需要更具体的论证的函数来代替一个需要更一般性论证的函数的原因。

在这一点上,我担心解决方案将取决于你希望Attr能够完成的任务。 您需要弄清楚为什么在某些情况下需要限制类型参数比其他情况更多。 如果在你的程序中概念上认为“某些Attr比其他Attr更具限制性”,你可以定义:

trait Attr[S <: Sys[S], B[Y <: B[Y]], A[X <: B[X]]]
def test[S <: Sys[S]]: Attr[S, Sys, L] = ...

但解决方案将取决于对A[_]的论点的限制意图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM