インターネットで調べてみたところ、論理理論の講義にどんどん退化していない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"の値を作成することができます。そして、関数本体は、これをどのように行うかを正確に記述します。
それは理にかなっているようですが、あまり面白くありません。だから明らかにこれ以上のものがあるに違いない...