PLT 板


LINE

看板 PLT  RSS
※ 引述《macbuntu (邀怪)》之銘言: : 但是仔細想想, 就開始懷疑某些 variance 在實務上的實用性, : 甚至有時候會干擾原先 OO 的語意? 就像你說的, "High explosives, handle with care." 用得好的話,應該是不會的。不是也有一句話, 你沒辦法阻止別人要開槍打在自己的腳上? XD : 譬如從 Covariant 開始, 如果定義 List[+T], : 則只要 A 是 subclass of B (這裡用 A < B 表示), 則 List[A] < List[B]. : 從 OO 的觀點, 這表示 List[A] 可以被當成 List[B] 用在所有 List[B] 出現的地方. : 但實際上卻不然, List[B].add(B) 就不該能用 List[A].add(B) 才對. 在這邊引用 Java 的 array 的例子,應該就算是一個不良應用吧,哈哈 XD 在 Scala 裡,Array[A] 是 invariant 的,不是 covariant 的。 http://www.scala-lang.org/docu/files/api/scala/Array.html 然而 List[+A] 是 covariant, 但會有這個問題嗎?答案應該是不會。 因為 List 其實是 constant, 根本就沒有 add 這種會改變 state 的操作。 因此任你隨意去 point/refer, 不會使得容器被存入錯誤的東西。 也就是說以下: : Java 的 array 就是 covariant, 變得會允許下面這種不正當的操作: : String[] s = new String[5]; : Object[] o = s; // array is covariant so this is allowed : o[3] = new Object(); ^^^^^^ 這件事本身是沒辦法發生在 Scala 的 List 上, 而 Array[A] 則是 invaraint 的。 : String name = s[3]; // throws ArrayStoreException ! 所以絕不會產生這種,我覺得有點可笑的 exception... : 反過來, Contravariant 就更令我納悶了, 如果定義 List[-T], : 表示當 B < A, 則 List[A] < List[B]... that makes my head spin... : 所以如果用 Java 的 pseudo code 來表示, 變成: : Object[] o = new Object[5]; : String[] s = o; // this is allowed if contravariant : 真的會有好的理由在實務上需要這樣的 variant 嗎? 在我自己的感覺, : 這種功能造成的問題可能比解決的問題還多... 用 Java 的角度去看,我想確實是很難找到需要 contravariant 的時候。 然而可以看這裡: http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science) 我們知道 overriding method 可以有 covariant return type, 但是 parameter type 呢?事實上卻是相反,是 contravariant 的。 用同樣的概念,class pointer/reference 可以指向 subclass instance, 所以 parameter 應該也可以用 class pointer/reference 指向 subclass instance. 以 Java 為例的話:(例子隨便舉的啦 @@) class Human{ public Human touch(Mutant m){ return m; } } class Mutant extends Human{ @Override public Mutant touch(Human h){ // ^ OK, covariant return type // ^ OK, contravariant parameter type. return this; } } 不過這只是個美好的夢,Java 不支援的樣子 XD C++ 也不支援,甚至 Scala 自己也不支援... 這邊可以想像成,在 Mutant#touch 裡面,用 Human h 去接 Human#touch 裡的 Mutant m, 應該不會產生什麼不良的操作。 但是 Scala 自己也不支援,或許是因為怕產生一些混亂吧。 可以改看 Function 的例子,那就真的是有 contravariant parameter type 了。 http://www.scala-lang.org/docu/files/api/scala/Function1.html trait Function1[-T1, +R] extends AnyRef 其中 -T1 是第一個 parameter, +R 是其 return type. 一樣的 Human/Mutant 例子: class Human; class Mutant extends Human; // 定義變種,把正常人類轉換成變種人。 // apply 是 mutate 的 method, 當我們寫 mutate(h) 時會喚起。 val mutate = new Function1[Human, Mutant]{ def apply(h: Human) = new Mutant; } // 定義治療,可以把變種人類轉換回正常人類。 val false_heal: Function1[Mutant, Human] = mutate // 定義我,希望可以從變種人轉換回正常人類。 val me: Human = false_heal(new Mutant) 這邊實際上 argument 的套用,就是把 new mutant 丟給 apply 的 h, 而 me 雖然是 Human, 但可以指向 Mutant. 可以想像成 +A 是允許 type 往上層移動,而 -A 則是允許 type 往下層移動。 因此這邊也是可以寫: val create: Function1[Null, Any] = mutate val any: Any = create(null) 這就是極端的例子,丟最底層的 null 進去,而拿到一個最上層的 any 回來。 在 Java 裡,就像是 Object any = mutate(null); 這樣。 : 所以湊在一起就是會有衝突的地方吧? 感覺上 Java 比較保守, : 盡量維持 class based typing 的一致性, 而 Scala 就蠻大膽的, : 全部放進去看看大家怎麼用 (functional programming? anyone? ...) Java 確實是非常保守,實在不是我能夠喜歡的語言,哈哈 XD 而 Scala 也確實是放了一大堆東西進去,多到我覺得有點不可思議... 這一兩天為了寫這幾篇,翻了點 Scala 的東西,開始覺得還滿有趣的 :p 只是他的語法實在有點多變,keyword 也一大堆,要適應可能要一點時間。 至於 functional programming 嘛,看到現在還是覺得 Haskell 最乾淨漂亮。 歡迎來這裡逛逛: http://flolac.iis.sinica.edu.tw/lambdawan/ 雖然說冷了很久很久了(PLT 板也是),不過 function programming 是 最熱門的話題喲。 http://flolac.iis.sinica.edu.tw/lambdawan/forum/22 -- Nobody can take anything away from him. Nor can anyone give anything to him. What came from the sea, has returned to the sea. Chrono Cross --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18 ※ 編輯: godfat 來自: 220.135.28.18 (03/15 15:25)
1F:推 jaiyalas:推最後的廣告(淚光~) XD 03/17 09:48
2F:推 noctem:(淚....) 03/17 19:17







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP