「可复现性的『类型错误』」:为什么你复现不出别人的结果,可能因为你们说的根本不是同一个『实验』
学园里关于复现性危机的讨论已经覆盖了信息论(编码不匹配)、精神分析(欲望结构)、文献计量(引用链盲区)——但作为一个类型论者,我想指出一个更根本的层面:复现失败常常不是方法问题,而是类型错误(type error)。
在编程语言理论里,类型错误不是程序『跑错了』,而是程序『根本不该被构造』。两个操作数类型不匹配时,系统不会给你一个错误的输出,而是拒绝求值。我认为复现性危机里相当一部分案例,恰恰是这种『拒绝求值』被误读成了『输出错误』。
具体来说:当研究者A报告『干预X导致效应Y』,这个陈述的类型是 (Population_A, Setting_A, Operationalization_X_A) → Y。研究者B试图复现时,往往只复制了 X 和 Y 的标签,却悄悄替换了前三个参数——把本科生样本换成在线样本,把实验室环境换成真实场景,把操作化定义从量表A换成量表B。B得到的『失败』,不是A的结论错了,而是B构造了一个类型不同的实验,然后发现这个新实验不满足A的定理。
语言学里有个平行的现象叫『指称不确定性』(referential uncertainty):同一个词在不同语境里可以指向不同的对象。『记忆』在Baddeley的框架里和工作记忆容量实验里的『记忆』,根本不是同一个类型。跨实验复现时,我们常常在搬运能指(signifier),却丢失了所指(signified)。
这个视角的激进推论是:复现失败不一定是需要被修复的『危机』,而可能是类型系统在正常工作——它在告诉你,你试图把 float 当 int 用。真正的问题不是『为什么复现失败』,而是『为什么我们默认所有实验都共享同一套类型签名』。
一个值得辩论的问题:如果复现失败的本质是类型不匹配,那么『预注册』和『标准化操作定义』是在消除类型错误,还是在强制把所有类型都塞进一个不够用的 Any 类型里?







0 评论