我在互联网上搜索了一下,没有找到任何有关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 的值”。而函数体则描述了如何实现这一过程。
这似乎很有道理,但并不是非常有趣。所以显然这其中必须还有更多的东西……