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