看板 PLT 關於我們 聯絡資訊
其實主要的問題是來自《世紀末軟體革命復刻版》這本書, 因為書中在多型的部份提到了強制同型(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