作者:匿名用户  原文链接:https://www.zhihu.com/question/61109979/answer/476232890


事情是这样的,有一天一位中医大师来跟我们程序员传播中医思想……


大师:阴阳相当于事物的两种状态,只不过是一种符号,就像计算机中的0和1一样,真正的程序员都是非常推崇中医思想的,我邻居家的儿子就是一个程序员,在微软工作,他曾经……

我:大师,为什么是两种状态?不是三种状态?四种状态?

大师:你这不是抬杠么?为什么计算机是二进制?阴阳是一种相对表示方法论!热是阳,寒是阴,多热是阳?多寒是阴?看你跟什么东西来比较,比如跟0℃相比,100℃就是阳。

我:这题我会!计算机并不需要一定用二进制,图灵机计算模型的表示完全不需要依赖二进制,Lambda Calculus 计算模型甚至不需要有状态 。并且,程序不能只用0和1两种状态表示比较大小的结果,你把大的说成阳,小的说成阴,那相等该怎么表示?所以现在先进的编程语言都会加入 Ordering 类型,分别用 LT、GT、EQ 表示大于、小于、等于。你觉得相等就相等嘛根本无需比较,可是相等的概念也是相对的,比如相对于99℃,99.1℃是不是阳?99.01℃是不是阳?…… 所以程序比较 Floating Number 时,都是取一个容许的最大误差 epsilon,两个值相差绝对值小于 epsilon 就认为相等。请问中医分类阴阳时取的 epsilon 值是多小?如果大师指的是指布尔逻辑,首先,01和布尔值混用只是C语言恐龙时代遗留下来的不良风气,然后,现代软件开发都建议避免用 Bool 类型表示对象的状态,避免 {status:Bool}这种烂代码,因为它没有传递任何信息,if object.status == True ? 你说一个东西状态是阳?什么鬼?这属于典型的不肯好好说人话!正确的做法是要么定义成 {isOverheat:Bool},要么定义一个 data TemperatureStatus = Overheat | Supercool | Regular ,你看, if body.temperatureStatus == Overheat then return Paracetamol!这代码多好理解!如果将来重构需要添加新的状态,还省了把其它接口中的 Bool 换成新类型。从程序设计角度来讲,不直接说一个东西温度多冷多热,绕圈子说一个东西属性是阴是阳,不但没有任何好处,还丢失了重要信息,使代码难于理解。代码越难于阅读理解,隐藏的 Bug 就越难于被发现,比如代码 herb.irritationLevel = weather.temperLevel ,两种不同类型的值是不能这样直接赋值的,草药的刺激属性怎么能随便直接跟天气温度混淆呢?至少要有个什么证明?什么转换吧?如果全用 Bool 表示,这个 Bug 就这样悄无声息地躺在那里,如果用 Enum/Algebraic Type,编译器就能立即发现这个 Bug。还有,函数参数也要避免使用一堆无意义的 Bool 参数,doctor.diagnose(true,false,true,false,false),这什么鬼代码?说人话不会吗?同理,推而广之,用阴阳表示温度大小是烂代码,一鼓脑用性寒性热概括药物的辣度、营养含量、卡路里、重金属含量等等同样也属于烂代码。更多干货请参考:《Clean Code》、《Code Complete》、Avoiding BooleansBoolean blindness ,谢谢!


大师:行了行了,反正就那么个意思,就是那个GT、LT符号,万物都有强弱大小状态变化,我们比较分成阴和阳,你看,强奸也说强,强国也说强,这就像阴阳寒热,万物都是相通的,天气有寒热,药性也有寒热,中医就是利用药物这些寒热偏性去纠正人体的偏性,你们程序员叫这个什么来着?一切皆对象!继承!多态!樊代明院士举过一个很贴切的例子:癌细胞个头大,洋鸡蛋个头也比较大,所以洋鸡蛋就是癌细胞。譬如食盐能炒菜,工业盐也能炒菜,因为他们都有盐性!


我:不对不对!食盐和工业盐都属于盐,这叫 Subtype Polymorphism(子类型多态),然而程序语言中子类型多态要遵守Liskov substitution principle(李氏代换原则),父类型能用的地方都能代换成子类型,能用任何化学盐类的地方,换成食盐也行,但反过来不行,不同兄弟类型也不能相互代换,所以工业盐不能炒菜,编译器会报错的!对象比较大小接口叫 Parametric polymorphism(参数化多态),type class Ord<a>,但类型变量 a 不能同时为多个类型,比如一个寒热比较的接口:HotOrNot<T>,草药的寒热不能和人体的寒热相比较,两个 Hot Girl 可以更 Hot,但一个 Girl 加一根辣椒并不能更 Hot,事实上在程序里面这两者加到一起就是个 Type Error。至于强奸和强国,连 Ad hoc polymorphism 都算不上,他们只是名称相似,没有任何其它联系,不能相互代换,国家不可能通过强奸公民而成为强国。如果中医的寒热分类属于上面任何一种多态,那分类相同药物和人体病症之间就可能相互作用的说法逻辑上是说不通的……


大师:不不不!药物功效在前,理论解释在后!是因为这个药能治热性的病证才被归类成寒性的,寒者热之,热者寒之,就像你们计算机里面,是先有病毒,然后才叫杀毒软件的嘛!

我:热者寒之,寒性的药物有很多,难道随便哪一种寒性药都能治任何热证吗?如果不能,那还是不符合多态代换原则,你在程序里定义了一个 abstract class Coldness,给接受该类型的函数扔一个该抽象类的子类实例,结果还是经常报类型错误,这程序还怎么跑?病人不会崩溃么?如果药物寒性仅仅表示它有可能治热证,那成功概率具体有多大?如果只针对热证的几种具体子分类,那应该定义成 Sum Type,而不是「清热解毒」这样一笼统地概括不求甚解,即使广谱抗生素,也有一个抗菌范围。假如杀毒软件像中医那样神神叨叨的话,那我们下载的就不是什么「AutoRun专杀/灰鸽子病毒专杀」工具,而是下载一堆「寒性/热性优化大师」挨个穷举尝试了。


大师:哎!中医讲究灵活变通,你们程序员就是死脑筋,要不说程序员多中医黑呢。治病哪有百分之百包好的?也要看命!说这么多有什么用,难道你们程序员能写出没有 Bug 的程序吗?

我:嘿!说到点子上了!拥抱 Dependent Type,告别 Bug!Coq、Idris总有一款适合你!



某些人真是奇怪,好像他们掩耳盗铃把我的评论删了,中医就值得相信了。

我只不过指出一些数据显示,补充疗法会带来更高的风险:

延误病情,补充疗法显著增加癌症患者死亡风险!JAMA刊文引发热议

站在高处图个嘴快说反对中医的人啥都不懂,可是被中医耽误治疗你又不会负责任。

小儿外科裴医生:为什么有一些人反对/支持中医?
这么说吧,当了十几年的医生,接诊过不少因为看中医而耽误的孩子,但还没有发现哪种不看中医就会耽误的病。