読者です 読者をやめる 読者になる 読者になる

Haskellでポーカーを作ろう 第三,四回のメモ

asパターン

パターンマッチの際にパターンマッチの対象となった値,つまり分解する前の値もまだ使いたいときがある.このようなときにasパターンが使える.

asパターンでは対象とするパターンの前にそのパターンにマッチさせる変数を@付きで配置する

変数@パターン
isStraight xs@(x:_) = xs == [x .. x + 4]

変数xsはカードの番号のリスト,xはリストの先頭.元のリストと連番のリストが一致しているかどうかを判定している.

判定処理の実装

以下の部分がどう動いているのか理解できていない...解説の部分をもうちょっとじっくり読んでみようと思います...

pokerHand :: Hand -> (PokerHand, Card)
pokerHand h@(Hand l) = 
    case foldl mplus Nothing $ fmap ($h) hands of
      Just pc -> pc
      Nothing -> (HighCards, last l)

所感

とりあえず動きました,ワーイ

ハイアンドローとか簡単なトランプのゲームを自分でも実装してみたくなった.ちゅーんさんの解説記事,「設計はトップダウン,実装はボトムアップ」の流れがわかりやくてとてもよい勉強になった.各関数をここまでシンプルに表現できるのか,すげーというカンジ.特にストレートかどうか判断するためのstraightHintとか綺麗だと思う.これまでだったらfor文やdoブロックを使うようなところを高階関数で表現できてよい.まだ慣れてないから使いこなせないのだけど..あとはまだエラー文になれてなくてパッとどこを修正すればいいか分からないことが多々ある.他には代数的データ型を使うとグッと安全性が高まるなーという印象.

最後のほうのまだ理解できてない部分をこれから追っていこうと思います.

参考URL

tune.hateblo.jp

tune.hateblo.jp

tune.hateblo.jp

tune.hateblo.jp

2015/05/21断面

github.com