代数数据类型的“代数”表达式对于具有数学背景的人来说非常具有启发性。让我试着解释一下我的意思。
已经定义了基本类型
•
+
X
1
用X²
表示X•X
,用2X
表示X+X
等等,我们就可以为链表定义代数表达式
__abc0↔__abc1
二叉树:
__abc0↔__abc1
现在,作为一名数学家,我的第一直觉是对这些表达式着迷,并试图求解L
和T
。我可以通过重复代换来做,但似乎更容易滥用符号,假装我可以随意重新排列它。例如,对于一个链表:
L = 1 + X • L
(1 - X) • L = 1
L = 1 / (1 - X) = 1 + X + X² + X³ + ...
在这里,我以完全不合理的方式使用了1 / (1 - X)
的幂级数展开,得出了一个有趣的结果,即L
类型要么是Nil
,要么包含1个元素,要么包含2个元素,或者3个元素,等等。
如果我们用二叉树来做,会更有趣:
T = 1 + X • T²
X • T² - T + 1 = 0
T = (1 - √(1 - 4 • X)) / (2 • X)
T = 1 + X + 2 • X² + 5 • X³ + 14 • X⁴ + ...
同样,使用幂级数展开(用Wolfram Alpha完成)。这表达了一个(对我来说)不明显的事实,即只有一个有1个元素的二叉树,2个有2个元素的二叉树(第二个元素可以在左边或右边分支),5个有3个元素的二叉树等等。
我的问题是,我在这里做什么?这些操作似乎不合理(代数数据类型的平方根到底是什么?),但它们会导致合理的结果。两种代数数据类型的商在计算机科学中有什么意义吗,还是只是符号技巧?
也许更有趣的是,是否有可能扩展这些想法?是否存在一种类型代数理论允许,例如,类型上的任意函数,或者类型需要幂级数表示?如果你可以定义一类函数,那么函数的组合有什么意义吗?