2016-12-03 66 views
1

我在閱讀Scala中的編程,我想清除一些關於編譯器推斷位置是否定的,中性的或肯定的規則以及確切定義爲位置的規則。斯卡拉的位置變化

我知道這個問題已經在這裏問了很多,但是閱讀這些答案讓我更困惑。

因此,從書中的例子,並改變它有點讓我可以更容易地表達我的問題。

abstract class Cat[-T, +U] { 
    def meow[W](par1: T, par2: Cat[U,T], par3: Double): Cat[Cat[U, T], U] 
} 

所以問題是:

  • 書中最初指定的位置是一種類型的參數可以被使用的碼內的每個點(即到處T和U可以是),後來指定所有值參數都是位置,這是否意味着我的示例中的par3是一個位置?

  • par1T是負的位置,因爲在外部‘範圍’一切爲正,內部方法值參數的位置的符號的改變和取範圍外的相對值。同樣的推理par2Cat[U,T]作爲一個整體的立場是否定的。我對這些嗎?

  • UT裏面par2Cat[U,T]分別是正數和負數。發生這種情況的原因是因爲前一個項目符號中使用的規則?

  • 在這本書中還有另外一個規定說,位置標記牌翻轉也發生在情況:

    類型的類型參數,如C[Arg]Arg,當C相應類型的參數有內部型參數與逆變定義

    即我的理解是指如下定義的的情況下C

    class C[-T] 
    

    那麼,如果這個工程,我明白不應該在前面的子彈的情況下,這一規則也同樣適用,因此具有par2Cat[U,T]U的位置翻轉(再次),因爲在Cat類定義的第一類參數是用反變量定義的?

現在到返回類型

  • Cat[Cat[U, T], U]作爲一個整體是積極的,因爲沒有規則或任何要說它改變的跡象。與最右邊的U相同的邏輯,因爲Cat與第二個類型參數是協變的。

  • 內部Cat[U, T]由於子彈4而具有負位置。 正常情況下,它通過繼承外部範圍標誌而具有+,但由於子彈4而發生翻轉。

  • T裏面的Cat裏面的返回類型分別有+和 - 符號的規則是什麼? 「類型嵌套」是否對標誌有任何作用?

請糾正我在哪裏我錯了。

回答

1

所有你在形式上的問題「我是對的嗎?可以回答爲「是的,你是對的」。 約型嵌套最後一個問題可以回答爲

型嵌套起着方差計算關鍵作用

我們可以儘量減少規則簡單地更換具有相應功能類型的每一個方法的類型,所以你的類型可能被表示爲

abstract class Cat[-T, +U] { 
    type Meow[W] = (T, Cat[U,T], Double) => Cat[Cat[U, T], U] 
    def meow[W]: Meow[W] 
} 

下,瞭解每個FunctionN具有N + 1個類型參數,WH的第一N ICH作爲逆變和最後一個是協變和MeowFunction3的應用,我們可以得出一些類型的樹

type tree http://svgshare.com/i/KQ.svg

樹的根是新在你的情況定義類型,class Cat。它可以被理解爲所有成員的產品,所以如果有更多的def \ val \ var \ type成員提出,Cat[-U, +T]下更多的節點應該與Meow類型一起繪製

在這裏,我們必須保證每次出現協變參數應該具有「正」的路徑,即從根開始的紅/負/協變邊緣的計數,並且每個逆變的出現應該具有奇數紅邊的「負」路徑。

還要注意,可能存在一箇中性路徑 - 一條路徑,其中至少存在一個不變類型參數邊緣。該路徑必須以不變類型參數或某些不相關類型結尾

+0

樹中的根不應該是Cat [-T,+ U]?你的意思是,而不是事件的權利? – user183833

+0

@ user183833是的,謝謝。請參閱圖片後面的段落 – Odomontois