Lobsters | 原文链接 | 2026-09-19 收录

FAQ:为什么可变类型不是不可变类型的子类型

来源: crumbles.blog — 2026-09-17

概述

文章回答语言论坛上的老问题:为什么可变与不可变版本的数据结构不能互为子类型。作者回到 Liskov 替换原则的严格定义,用最简单的 pair 结构推导:需要可变 pair 的地方会调用 set-car!、set-cdr!,而不可变 pair 没有这些操作,所以不可变不能顶替可变;反过来也不能,因为子类型的契约还要满足调用方对「已构造值不会被改写」的预期。

核心要点

金句

这不是做不到,而是这样做在形式上不正确,你至少会丢掉语言本来能给出的部分类型检查保证。
返回 Lobsters 首页