プライム、プライム、プライム

数万語あるスペル辞書から「amble、blame、mabel、mable」のようなアナグラムになっている単語を拾い出すというプログラムをHaskellでもやってみようと頑張ってみた。前にRubyで書いていたし、比較的簡単にかけそうな気がしたのだけど、コンパイルエラーが出まくって全然ダメ……。

やっぱりまずは基礎なんだと思って、ふつうのHaskell本を3分の2のあたりまで読み進めた。非常におもしろい。

Haskellってすごくピュアな方面を目指してるんだと思ったけど、二項演算子は扱いが特殊だったりして、案外不純なんだなと思った。「a + b」式の二項演算子なんて排除して、すべて「+ a b」でいいじゃんというのがLispとかScheme系の人の発想なんだろうけど、Hakellは意外にも「a + b」を許す。で、面白いのが普通の関数でも「a 'func' b」と書くことで、あたかも2項演算子のように書けるというところ。逆に「(+) a b」のようにして、二項演算子をふつうの関数のようにも扱える。「a 'func' b」は「func a b」に比べると、かなり汚いし打ちづらいように思うんだけど、どうしてこんなことをしたんだろうか。

もう1つ、Hakellのソースを見ていて何だろうなと思っていた「'」がついた関数名の謎が解けた。これは、数学っぽい「プライム」を示している。関数名には英数字、アンダースコアのほかにシングルクオートが使えるというだけのことだけど、Haskellでは習慣として「func」「func'」のように関連する関数名の最後に「'」を付けるものらしい。どんどん「func''、func'''」と付け足せる。まさしくプライムやんか!

二項演算子の右結合、左結合、優先順位あたりも明示的に設定できたり、リスト内包表記で宣言的に処理対象を集合のように扱えたり、確かにHaskellは数学っぽい雰囲気がいっぱいあるなと思う。