配列をユニークにしてその個数とともに返せをHaskellで

もとはbabieさんとこでやっていたのをrubycoさんがやっているのを見て、やりたくなった。

ほんとは、rubyで書こうと思ったんだけど、inject使って、Hashでっていうのを書いた後に、それbabieさんがやってるじゃんということに気づきた。しかし、

["foo","bar","foo","baz","bar","foo"].inject(Hash.new(0)){|i,j|i[j]+=1}

が、

TypeError: can't convert String into Integer

をだしてくる意味に気づかんかった。

i[j]+=1

が、Hashオブジェクトを返してくると思っていたよ。

というわけで、急遽Haskellで素直に書いた。

Prelude List> map (\x-> (head x,length x))$group$sort ["foo","bar","foo","baz","bar","foo"]
[("bar",2),("baz",1),("foo",3)]

77byte。しかし、Listモジュールを使っているから、ghci上なら":m List".lengthをプラスせねばならない。それに、babieさんの結果の順と違うから、ほんとはいけないのかもしれない。コメントのところに書かれているsumimさんのsmalltalkは、Listみたいにインポートしなくていいのかしら?それにしても、短く書けるなぁ。

いつもながら、golf系で出力せよって、シェルの出力に出力を任せてもいいのかしらと。あと、問題で決められた入力の部分の文字数はカウントすべきが、しないべきかも気になるんですよ。