よりよいハトクラモナド

この記事はHaskellAdventCalendarの記事から派生したスピンアウト記事です。 ハトクラモナドの記事を上げたらちゅーんさんから愛のマサカリこっちのほうがいいのではって提案を頂いたので、それを踏まえてまだたりないものが何かを考えてみたり、自分でちょっとわからなかったことを聞いたのをメモったりします。

その1:モナドの中身を多相型にするべき?(という名の半分言い訳)

まず、ちゅーんさんの記事でも指摘してもらったとおり、モナドの中身が多相型じゃなくてCoins (=Int)になってます。
僕としてはハトクラに限定するんだったら絞っとかないと「ハトクラのモナドです!」って言い貼れなくなっちゃうのではないかという考えで、多相型ではなくCoinsを入れてしまったのですが、よくよく考えたら実用考えてなかったわ……(元から半分ネタというのは抜きにしても) 実用的には他のMonadインスタンスががそうしているように多相型にすべきでした。

その2:すでにそのフェーズでプレイされたカードが遡れない

ハトクラのカードの中にはその手番ですでに使われたカードに振る舞いが影響されるカードがあります。少なくとも>>=でただ単につなげただけじゃそれを遡ることはできないので、状態に持ってるFieldに持たせるといいのでは(by ちゅーんさん)という話を聞きました。

その3:カードを連結できない状態に陥った後の挙動が若干イケてない

というのも、カードが連結できない状態になったとしても、Left(またはNothing)で後続のカードが無視されるだけで、連結自体はできちゃうという状態になってるというのが問題です。 なんかそうなってくるとモナドの仕組み以外にもなんか色々必要な気がしてきちゃったのですが、どうしましょう。