簡體   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