「:」と「++」の違い

難しい・・・というよりピンとこない
id:yuki_neko_nyanに手ほどきをしてもらった

「++」演算子

(++) :: [a] -> [a] -> [a]
  • 「++」はリストを連結する
[1,2,3,4]++[5]
	→[1,2,3,4,5]

「:」演算子

(:) :: a -> [a] -> [a]
  • 「:」は第二引数のリストの先頭に第一引数を追加したリストを返す
1:2:3:4:5:[]
	→[1,2,3,4,5]

ところが次のは通らない

[1,2,3,4]:[5]
	→エラー

「:」演算子の定義を見ると第一引数と第二引数はリストのネスト数が違う。
第二引数は第一引数よりリストのネストが1つ大きくなければならない
よって

[1,2,3,4]:[[5]]
	→[[1,2,3,4],[5]]
[1,2,3,4]:[[5],[6]]
	→[[1,2,3,4],[5],[6]]

これらは通る。
更に

concat $ [1,2,3,4]:[[5]]
	→[1,2,3,4,5]

なんてこともできる。これは

concat :: [[a]] -> [a]

だからだ。

動かしてみてそういう動作なのは理解できたが、バックグラウンドというか意義についてはピンとこないなぁ。
この辺は慣れが必要なところかなと思う。