作者godfat (godfat 真常)
看板PLT
標題[問題] ML 與 coercion
時間Sun Feb 25 18:31:16 2007
其實主要的問題是來自《世紀末軟體革命復刻版》這本書,
因為書中在多型的部份提到了強制同型(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