2024-07-03
注意力训练 代数视角里的类型
... 注意到可以通过枚举成员的方式来
定义
类型:
00// 共 256 个,可使用 8 bit = log2(256) 来存储表达, 即 0x00 到 0xFF 
01enum Uint8 { 0, 1, 2 ... 255 }
02
03// 共 2 个,可使用 1 bit = log2(2) 来存储表达, 即 0b0 和 0b1 
04enum bool { true, false }
... 集中注意力:
00enum Unit { onlyOne }
01// 共 1 个成员,占用 0 bit = log2(1) 来存储表达 (没错,这就是 null)
... 进一步集中注意力,写出 never 的定义:
00// 占用 log2(0) 将会使用趋近于 -∞ 来存储表达,因此代码里出现这个的时候,
01// 程序就中断了, 表现上就是被 throw 了一样 (ts 里出现 never 的表现)
02enum never { }
... 注意力涣散:
00// 那么,需要占用多少 bit 可以存储表达 ? 
01enum unknown { 一切合法取值 }
—— 是的,一个 unknown value 就是任意长度的 buffer,因此这类类型在任何语言里处理起来都很胃疼,比如 go 的 interface{},C 的 void*,Swift 的 Any 等等
—— 这同时也是 unknown 比较难处理的原因,总是需要写一个谓语
(x: any): x is X
来做 narrowing 降级到具体的类型才能实现处理。
(实际 ip 协议就是用 C 的 struct type 实现的, 更进一步说: C struct type 厉害的地方是将几个字段拼接在一起,其点读、点写的实现走 base + 偏移的方式在编译器层面实现, 对于 CPU 来说这就是任意长度的 buffer,在这个基础上定义了 unknown 因而实现了定义积类型 + 复杂世界抽象的能力)
(另外,用 0x00 作为 null 的底层存储是有问题的,实际上由于可以用 0 字节去存储 null 就说明是可以通过编译器构造的语法去避免出现 null 的,这也是前现代语言走的弯路了,而当代语言 Rust Moonbit Swift 等都带了 enum adt 了,就不会有 null 的问题了)




回到顶部