類っていうか種っていうんですね
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