Haskellではコンパイル時に型がチェックされます。そういう言語は多いですよね。

特徴的なのは型推論。おかげでほとんどの場合型を宣言しなくても大丈夫です。とは言っても完璧ではないので明示的に宣言できるようになっています。そのときに使うのが「::」。これまでも関数を定義する際に型の宣言をしていましたね。

多相型というのがあります。例えばlength関数の場合

length :: [a] -> Int

となっていますが、この例でのaが多相型です。要は何でも良いよと。