PLT 板


LINE

看板 PLT  RSS
其實主要的問題是來自《世紀末軟體革命復刻版》這本書, 因為書中在多型的部份提到了強制同型(coercion), 大抵上對於這東西我沒有太多疑問,可是有一句話一直讓我很感興趣。 [quote] 可惜的是,C++ 裡面只能勉強用型別轉換的多載來模擬出它的功能, 想要了解它的話,最好去玩 ML。 [/quote] 首先讓焦點停在強制同型(coericon)上,就我所知,他的概念大概是 把不同型別視為同一種型別。書中提到了一個簡單的例子是: double number = 1 + 3.1415926; 由於 1 是 int, 而 3.1415926 則是 double, 兩者型別不同怎麼相加? 在 C++ 裡,int 會被轉型成 double, 成為 1.0 + 3.1415926. 這個動作叫 standard conversion, 在這裡是 implicit 喚起的, 而且後來產生的 1.0, 和原本的 1 是不相同的,意思是 1 和 1.0 是不能視為同樣的東西,只是他們之間存在著 implicit 發生的轉換。 void f(double&); // 接受 double 的參考 int i; f(i); // error, 型別不合,int const& 或 int& 或 int 不能視為 double& void g(double); int i; g(i); // ok, 由 i 產生出一份型態為 double 的 copy, 丟給 g 這是一種 implict conversion, 亦即不用 programmer 說明就會自動發生的轉換。 另一種則是 explicit conversion, 亦即需要 programmer 說明才能轉換的動作, 如: void h(double); int i; h(static_cast<double>(i)); 或是傳統 C style 的轉換(這種轉換具有比上面多很多的語意): h((double)i); 也就是說所有可以 implict conversion 的都可以是合法的 explict conversion. 這裡不再多討論 explict conversion, 因為跟 coericon 似乎比較沒關係。 回到 coericon, 在 C++ 中有一種 user-defined conversion, 寫成程式碼大概是這樣: class A{}; class B{ operator A(); }; 意思是,所有 B 的 instance 可以 implicit 轉換成 A 的 instance, 如以下: void i(A a); B b; i(b); // ok, b 可以如 int 變身成 double 般變成 A 的 instance 如果試圖印出 b 與 a 的記憶體位置,可以發現他們是不同實體 當然,這是因為 call by value 之故,本來就不可能是同一個實體 如果改成這樣: void j(A&); B b; j(b); // error, B 不能轉換成 A& 可是如果把 class B 的定義改一下: class B{ operator A&(); }; j(b); // ok, B 的 instance 也可以視為 A 的 reference... 也就是說,這樣寫還真的可以把 B 也視為 A 了… 怎麼實作又是另一回事了,這裡先不談。 constructor 的 implict call 也不多談了,不然會扯太遠…。 不過其實這個動作也有那麼一點類似 Base class(super-class)與 Derived class(sub-class)之間的關係。也就是 super-class 的 reference/pointer 可以指涉 sub-class 的 instance, 似乎沒有必要 把型別系統弄得這麼複雜?也許只要使用繼承關係和 template 就夠了。 另外在 Perl 裡字串和數字可以任意轉換: '123' + 1 . '1'; # 1241 '123' + 1 + '1'; # 125 '123' . 1 . 1 ; # 12311 '123' . 1 + '1'; # 1232 我想這可能是 coericon 的極致…? 回到最初的問題,coericon 是一種把型別模糊化的方式, 可是在 ML 中有這種狀況嗎? 我四處翻查了 ML 家族的資料,最著名的當然就是 type inference, 也就是不需要指名型別,由我們操作該變數的方式來判斷他到底應該是 什麼樣的型別。如: a + 2 則 a 很有可能是 int. 從來沒用過 ML 家族的語言,所以就不多談了,只是看來看去, 一旦型別決定了,似乎就不能再改變了?如此一來跟 coericon 有關嗎? 我知道這本書的內容有點年紀了,所以也許名詞改變,或是一些實作上的改變, 以至於這本書的這句話有些不太對勁。不過還是很好奇當初說這句話是基於 什麼樣的原因?更何況可能是我真的搞錯什麼了也說不定。 另外就是真的很期待能有什麼新書 XDXD 雖然台灣人寫的書我也沒看過幾本,可是由於這本書, 讓我覺得台灣人應該也是能寫出很棒的書吧 :p 如果因為什麼原因而沒繼續寫下去,真的是太太太可惜了… -- By Gamers, For Gamers - from the past Interplay --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18







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燈, 水草

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

TOP