椿の日記

たぶんプログラムの話をします

類っていうか種っていうんですね

Kindについて調べていましたが、言語仕様に詳しく書いてありました。

http://www.sampou.org/haskell/report-revised-j/decls.html

  • 記号 * はすべての引数なしの型構成子を表す。
  • もし、k1 および k2 が種ならば、 k1-> k2 は種 k1 のある型を引数としてとり、 結果として、種 k2 のある型を返す ような関数の型の種である

↓このへんが実に面白いです。

  • 関数の型は (->) と書き、種は * -> * -> * である。
  • リストの型は、[] と書き、種は * -> * であ る。
  • タプルの型は、(,)、(,,) などと書き、そ れらの種は、* -> * -> * 、* -> * -> * -> * 、などで ある。

だから例えば「String -> IO ()」という関数型というのは「String」と「IO ()」を中置記法関数「->」が受け取った結果なんですね。

これは前置記法に書き換えることができ、次のような書き方をしてもコンパイルが通ります。

printString :: (->) String (IO ())
printString x = print x