úÎlmi2%      !"#$SafeOne playing card*Card 1 Hearts == Card 2 Hearts -- EqFalse+Card 1 Hearts < Card 2 Hearts -- OrdTrue4 types of card$Hearts -- ShowHearts$read "Hearts" :: Suit -- ReadHearts"Hearts == Hearts -- EqTrue"Hearts == Spades -- EqFalse#Hearts < Diamonds -- OrdTrue$succ Hearts -- EnumDiamonds%For instance of show typeclass:In order that "K < A" equals True, consider 14 as the aceshowCardNumber 14"A_"showCardNumber 4"4_" All cardslength allCards52take 13 $ allCards5[H2_,H3_,H4_,H5_,H6_,H7_,H8_,H9_,H10,HJ_,HQ_,HK_,HA_]$reverse $ take 13 $ reverse allCards5[S2_,S3_,S4_,S5_,S6_,S7_,S8_,S9_,S10,SJ_,SQ_,SK_,SA_]Get Suit from cardcardSuit $ Card 10 HeartsHeartsGet Suit from cardcardNumber $ Card 10 Hearts10 Stregnth of cardcardStrength . head $ allCards2&Show typeclass of Cardshow $ Card 1 Hearts"H1_"show $ Card 14 Diamonds"DA_"show $ Card 11 Clubs"CJ_"show $ Card 10 Spades"S10" '% &   '% &Safe Constrained cards in hand:type fromHandfromHand :: Hand -> [Card] Cards to HardtoHand allCardsNothing3fmap (length . fromHand) (toHand $ take 5 allCards)Just 5*Detect poker hand and return strength Card3let sameNum = filter ((==14) . cardNumber) allCards6let sameSuit = filter ((==Hearts) . cardSuit) allCards"pokerHand (Hand $ take 5 sameSuit)(StraightFlush,H6_)Llet buta = take 2 allCards ++ (take 2 $ drop 17 allCards) ++ [last allCards]pokerHand (Hand buta)(HighCards,SA_)(Detect onePair and return strongest Card2let sameNum = filter ((==9) . cardNumber) allCards6let sameSuit = filter ((==Spades) . cardSuit) allCards2onePair $ Hand (take 2 sameNum ++ take 3 sameSuit)Just (OnePair,D9_) onePair $ Hand (take 5 sameSuit)Nothing(Detect TwoPair and return strongest Card2let sameNum = filter ((==9) . cardNumber) allCards4let sameNum' = filter ((==10) . cardNumber) allCards6let sameSuit = filter ((==Spades) . cardSuit) allCardsEtwoPair $ Hand (take 2 sameNum ++ take 2 sameNum' ++ take 1 sameSuit)Just (TwoPair,D10)2twoPair $ Hand (take 2 sameNum ++ take 3 sameSuit)Nothing twoPair $ Hand (take 5 sameSuit)Nothing-Detect ThreeOfAKind and return strongest Card2let sameNum = filter ((==4) . cardNumber) allCards6let sameSuit = filter ((==Spades) . cardSuit) allCards7threeOfAKind $ Hand (take 3 sameNum ++ take 2 sameSuit)Just (ThreeOfAKind,C4_)%threeOfAKind $ Hand (take 5 sameSuit)Nothing)Detect Straight and return strongest CardBstraight $ Hand (take 5 $ filter ((==Hearts) . cardSuit) allCards)Just (Straight,H6_)>straight $ Hand (take 5 $ filter (even . cardNumber) allCards)Nothing&Detect Flush and return strongest Card@flush $ Hand (take 5 $ filter ((==Hearts) . cardSuit ) allCards)Just (Flush,H6_)=flush $ Hand (take 5 $ filter ((<= 3) . cardNumber) allCards)Nothing*Detect fullHouse and return strongest Card2let sameNum = filter ((==9) . cardNumber) allCards4let sameNum' = filter ((==10) . cardNumber) allCards6let sameSuit = filter ((==Spades) . cardSuit) allCards4fullHouse $ Hand (take 2 sameNum ++ take 3 sameNum')Just (FullHouse,C10)4fullHouse $ Hand (take 3 sameNum ++ take 2 sameNum')Just (FullHouse,C9_)4fullHouse $ Hand (take 2 sameNum ++ take 3 sameSuit)Nothing"fullHouse $ Hand (take 5 sameSuit)Nothing,Detect FourOfAKind and return strongest Card2let sameNum = filter ((==4) . cardNumber) allCards6let sameSuit = filter ((==Spades) . cardSuit) allCards6fourOfAKind $ Hand (take 4 sameNum ++ take 1 sameSuit)Just (FourOfAKind,S4_)$fourOfAKind $ Hand (take 5 sameSuit)Nothing.Detect StraightFlush and return strongest CardGstraightFlush $ Hand (take 5 $ filter ((==Hearts) . cardSuit) allCards)Just (StraightFlush,H6_)cstraightFlush $ Hand (take 5 $ filter (\x -> cardSuit x == Hearts && even (cardNumber x)) allCards)Nothing6let sameSuit = filter ((==Hearts) . cardSuit) allCards7let sameSuit' = filter ((==Spades) . cardSuit) allCardsCstraightFlush $ Hand (take 3 sameSuit ++ take 2 (drop 3 sameSuit'))NothingCstraightFlush $ Hand (take 5 $ filter (even . cardNumber) allCards)NothingCheck straight in Hand%straightHint $ Hand (take 5 allCards)Just H6_.straightHint $ Hand (take 5 $ drop 8 allCards)Just HA_'straightHint $ Hand (take 2 $ allCards)NothingCheck flush in HandIflushHint $ Hand (take 5 $ filter (\x -> cardSuit x == Hearts) allCards )Just H6_FflushHint $ Hand (take 5 $ filter (\x -> cardNumber x == 2) allCards )Nothingn of Kind in Hand?let treeCards = take 3 $ filter ((==2) . cardNumber) $ allCards?let twoCards = take 2 $ filter ((==10) . cardNumber) $ allCards.let fullhouse = toHand $ treeCards ++ twoCardsfullhouse >>= nOfKindHint 2Just [[H10,D10]]fullhouse >>= nOfKindHint 3Just [[H2_,D2_,C2_]]fullhouse >>= nOfKindHint 4Nothing(&extract cardNumber $ take 5 $ allCards)[(2,H2_),(3,H3_),(4,H4_),(5,H5_),(6,H6_)](extract cardStrength $ take 5 $ allCards)[(2,H2_),(3,H3_),(4,H4_),(5,H5_),(6,H6_)]RDraw cards to make new hand from Deck Return a new Hand and Deck if its possible.Get hand from deck(Yamafuda)+let Just (hand, newDeck) = getHand allCardshand'Hand {fromHand = [H2_,H3_,H4_,H5_,H6_]}(let Just (_, newDeck') = getHand newDecktake 8 newDeck'![HQ_,HK_,HA_,D2_,D3_,D4_,D5_,D6_]GgetHand allCards >>= return . snd >>= getHand >>= return . take 8 . snd&Just [HQ_,HK_,HA_,D2_,D3_,D4_,D5_,D6_]#Get discardList(Sutefuda) from hand%String to [Int] for parse user inputstoIntList "1234"Just [1,2,3,4]toIntList "4019"Just [4,0,1,9]toIntList "z4q01"Nothing toIntList ""Just [] Get cards by indexesselectByIndexes "12345" [1..3] Just "123"selectByIndexes "12345" [10]Nothing!Judge victory you and AI# )*+,-./01 2( !  !    ! )*+,-./01 2( !Safe"Sutefuda by AI3let Just straightFlush = toHand $ take 5 $ allCardsaiSelectDiscards straightFlush[]Ylet Just fourCard = toHand $ take 5 $ (filter ((==10) . cardNumber) allCards) ++ allCardsaiSelectDiscards fourCard[H2_]rlet Just buta = toHand $ take 5 $ (take 2 allCards) ++ (take 2 $ drop (13+5) allCards) ++ (drop (13*2+9) allCards)aiSelectDiscards buta[H2_,H3_,D7_,D8_,CJ_]#Sutefuda = Hand - allYaku]let Just (x) = toHand $ take 5 $ (filter (\x -> (cardNumber x == 10)) $ allCards) ++ allCards fromHand x[H2_,H10,D10,C10,S10]nOfKindDiscards x[H2_]"#"#"#"#None3 Play poker4Input suteru cards5"aiDisuse :: Hand -> IO DiscardList6 print Yaku7 print Tefuda8Repeat y/n question9Hand with Sutefuda to String :;<$=>3456789$$ :;<$=>3456789Safe$  !"#?      !"#$%&'()*+,-./0123456789:;<=>>?@ABjavap_6zhLfinhfYt4e0wwKGPvToGame.Poker.CardsGame.Poker.Hands Game.Poker.AIGame.Poker.Simple Game.PokerCardSuitHeartsDiamondsClubsSpadesallCardscardSuit cardNumber cardStrengthDeck DiscardList PokerHandHandfromHandtoHand pokerHandonePairtwoPair threeOfAKindstraightflush fullHouse fourOfAKind straightFlush straightHint flushHint nOfKindHintdrawHandgetHandgetDiscardList toIntListselectByIndexes judgeVictoryaiSelectDiscardsnOfKindDiscards simpleGameshowCardNumber $fShowCardextract HighCardsOnePairTwoPair ThreeOfAKindStraightFlush FullHouse FourOfAKind StraightFlush playPoker inputDisuseaiDisuse printResult printHand ynQuestionshowChangeHandPlayerEnemyshowPlayerName matchPoker