我在互联网上搜索过,我找不到任何关于 CHI 的解释,这些解释不会迅速退化为逻辑理论的讲座,这让我大吃一惊。(这些人说的好像“直觉命题演算”是一个对正常人来说实际上意味着什么的短语!)
粗略地说,CHI 说类型是定理,程序是这些定理的证明。但这到底是什么意思?
到目前为止,我已经弄清楚了:
考虑
id :: x -> x
。它的类型是“假设 X 为真,我们可以得出结论 X 为真”。对我来说似乎是一个合理的定理。现在考虑
foo :: x -> y
。正如任何 Haskell 程序员都会告诉你的那样,这是不可能的。你不能写这个函数。(好吧,无论如何不要作弊。)作为一个定理阅读,它说“鉴于任何 X 为真,我们可以得出任何 Y 为真的结论”。这显然是无稽之谈。而且,果然,你不能写这个函数。更一般地,函数的参数可以被认为是“假设为真的这个”,而结果类型可以被认为是“假设所有其他事情都是真的”。如果有一个函数参数,比如说
x -> y
,我们可以将其视为 X 为真意味着 Y 必须为真的假设。例如,
(.) :: (y -> z) -> (x -> y) -> x -> z
可以理解为“假设 Y 蕴涵 Z,X 蕴涵 Y,并且 X 为真,我们可以得出 Z 为真的结论”。这在我看来在逻辑上是明智的。
现在,到底是什么Int -> Int
意思?o_O
我能想出的唯一明智的答案是:如果你有一个函数 X -> Y -> Z,那么类型签名会说“假设可以构造一个 X 类型的值和另一个 Y 类型的值,那么可以构造一个 Z 类型的值”。函数体准确地描述了你将如何做到这一点。
这似乎有道理,但不是很有趣。很明显,它肯定比这更多……