しりとり

来週の SICP 読書会 (LL魂もどき篇) のための問題と模範解答を用意した。
与えられた単語を全て使ってしりとりができるかどうかを調べるプログラムを書け、というもの。

模範解答は個人的な理由で無理に StateT を使ったので(ただ StateT が使ってみたかっただけ)、ちっとも模範的ではないと思われ。少なくとも Haskell を知らない人が大半を占める勉強会においては適当ではなかろう。でも別にいいんです。なんとなく StateT がわかった気になれたから。

で、ほんとは与えられた単語を使ってできるだけ長い列を見つけるという問題にしたかったんだけど、それだとしりとりが終了したかどうかを見分けるためのタグ(たぶん Either を使うのが一番いい)が必要になってしまって無駄に汚くなるのでやめておいた。

StateT なんてものを使わないで解こうと思ったら、permutation で単語を並べ替えて、その全ての場合に対してチェック関数でマップするのがいいと思う。このほうがよっぽど簡単でわかりやすいかな。