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 fromEnumsortBy (flip $ comparing length)などと書けるようにした。
比較はData.Function.onを用いた
compare = compare `on` fromEnumsortBy (compare `on` (negate . length))という書き方も教えてもらった
比較に関してはData.Ord.comparingのほうが直感的なのでそちらを採用したが、
Data.Function.onはそれ以外の用途にも使えそうなので、簡潔に書けそうな使いどころを身につけたい。

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .