作者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