Data.Function.onという、バシッと決まれば格好良さそうなやつを教わったのでバシッと決まる使いどころを探そう。
Problem 52 補足
こちらのコメントを参考に。うむ、こちらのほうが簡潔だ。
Problem 53 補足
こちらのコメントを参考に。確かにわざわざ
foldl (*)なんて書かなくてもproductで良かった。Problem 54 補足
これとこれ。そうか、
splitOnを自作せずとも、スペース区切りの場合ならwordsがあった。fromEnum (Rank 1) = fromEnum (Rank 13) + 1とすることでエースを13より大きい値として扱えるようにした。こういう場合、
toEnumはどうするのが良いのだろう?何となく対称性を持たせてはみたが。また、
sameRanks関数などを使ってワンペア・ツーペア・スリーカード・フルハウスなどを判定していたが、あらかじめ同じ数字ごとにグループ化して要素数でソートしておき、パターンマッチで役を判定できるようにしてみた。
Data.Ord.comparingを使ってcompare = comparing fromEnum、sortBy (flip $ comparing length)などと書けるようにした。比較は
Data.Function.onを用いたcompare = compare `on` fromEnum、sortBy (compare `on` (negate . length))という書き方も教えてもらった。比較に関しては
Data.Ord.comparingのほうが直感的なのでそちらを採用したが、Data.Function.onはそれ以外の用途にも使えそうなので、簡潔に書けそうな使いどころを身につけたい。