這種情況下(簡化爲,它並沒有多大意義的點)是由F#正確處理「:爲什麼F#泛型類型推斷在構造函數上有所不同?
type HumanBeing() = class end
type Animal() = class end
type CreatureController() =
member this.Register creature = creature
type CreatureFactory() =
let anAnimal = new Animal()
let aHuman = new HumanBeing()
member this.GiveMeAnAnimal =
(new CreatureController()).Register anAnimal
member this.GiveMeAHuman =
(new CreatureController()).Register aHuman
類型CreatureController.Register的正確推斷出:S型系統」一 - >「一,因此可以用兩個不同的參數來調用它。
現在下面的版本有一點區別:不是將生物作爲參數傳遞給CreatureController.Register,而是傳遞給它的構造函數。
type HumanBeing() = class end
type Animal() = class end
type CreatureController(creature) =
member this.Register = creature
type CreatureFactory() =
let anAnimal = new Animal()
let aHuman = new HumanBeing()
member this.GiveMeAnAnimal =
(new CreatureController(anAnimal)).Register
member this.GiveMeAHuman =
(new CreatureController(aHuman)).Register
第二個例子不能編譯,因爲註冊推斷動物,所以你不能調用new CreatureController(aHuman)
。
(注:在這種情況下,簡化工廠顯然是有缺陷的,因爲它總是返回相同的動物/ humanBeing,但如果你更換anAnimal/aHuman與功能的這種行爲不會改變)
爲什麼不CreatureControlled在第二種情況下創建爲通用?這是編譯器限制嗎?我錯過了一些非常基本的東西(還在學習......)?
我認爲總結是 - 你不能有一個構造函數本身是泛型的(但是泛型方法是完全正確的)。泛型構造函數意味着整個類型是泛型的,並且必須明確聲明。 –
從答案中可以看出,類型推斷有時可能會讓人頭疼,但我仍然傾向於使用類型註釋來使事情更加清晰。在你的情況下,如果你已經在控制器的構造函數中加入了類型註釋,這會幫助你找到問題 – Ankur
@Tomas你的句子總結得非常好。 –