せっかくHaskell本を読了したので、なにか書いてみよう!ということで、麻雀の基本役と待ちを計算するライブラリ「hml」を作りました。hmlは「haskell mahjong library」の略です。
使い方はこんな感じです。
> import Mahjong.Data > import Mahjong.Parser > :t parseAgari parseAgari :: NakiMentsu -> FetchType -> Pai -> [Pai] -> [Result] > parseAgari (NakiMentsu []) TUMO P1 [P1,P2,P2,P3,P3,M1,M2,M3,S1,S2,S3,S8,S8] [Agari (Ryanmen P1 P4) [TUMO_AGARI,PINFU,IPEKO,SANSHOKU_DOJUN]] > :t parseMachi parseMachi :: [Pai] -> [Machi] > parseMachi [P2,P3,P3,P3] [Ryanmen P1 P4,Tanki P2]
ちなみに上がったら死ぬとさえ言われる九連宝燈の多面待ちはこんな感じです。
> parseMachi [M1,M1,M1,M2,M3,M4,M5,M6,M7,M8,M9,M9,M9]
Shanpon M1 M9
Ryanmen M6 M9
Ryanmen M3 M6
Penchan M3
Penchan M7
Ryanmen M4 M7
Ryanmen M1 M4
Tanki M8
Tanki M5
Tanki M2
今回は基本部分だけライブラリにしましたが、フルスタックの麻雀ライブラリにするよりも、要素部分を独立させたほうが、外からは扱いやすいのではないかと。
しかしCabalは良いですね。簡単でわかりやすいです。
そういえば、数年前にGAEで作った「mj-cloud」はPythonでしたが、Haskellよりは遥かに大変だった気がします。
こういうアルゴリズムはリストモナドを使うと書きやすい気がしました。