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
はそれ以外の用途にも使えそうなので、簡潔に書けそうな使いどころを身につけたい。