[Haskell-beginners] Ord and Eq instances for complex types
Mike Meyer
mwm at mired.org
Wed Oct 19 00:27:19 CEST 2011
On Tue, Oct 18, 2011 at 2:47 PM, Daniel Fischer <
daniel.is.fischer at googlemail.com> wrote:
> On Tuesday 18 October 2011, 23:13:03, Mike Meyer wrote:
> > I'm working on a problem dealing with poker hands, and need to rank
> > them. The Ord instance seems like a natural for this, but the code came
> > out with a lot of repetitions in it.
>
> >
> > Is there some third alternative I've overlooked that combines the best
> > features of both approaches?
> >
> > Thanks,
> > <mike
>
> Well, you could use record syntax in the Hand type to avoid defining cards
> in the Eq instance,
>
> data Hand
> = HighCard { cards :: [Card] }
> | PairOf { rank :: Rank, cards :: [Card }
> ...
> | FulHouse { rank, minorRank :: Rank, cards :: [Card] }
> | FourOfAKind { rank :: Rank, cards :: [Card] }
> | StraightFlush { cards :: [Card] }
> deriving Show
>
> instance Eq Hand where -- if your hands are well-formed, you
> h1 == h2 = cards h1 == cards h2 -- could also derive Eq
>
I was thinking of some kind of mixed solution over lunch. This looks better
than what I had in mind. But what does "well-formed" mean in this context?
> quality :: Hand -> Int
> quality HighCard{} = 0
> quality PairOf{} = 1
> ...
> quality StraightFlush{} = 8
>
Could this be replaced by an assoc list of some kind?
I was actually contemplating adding a quality field to the record.
> instance Ord Hand where
> compare h1 h2 =
> case compare (quality h1) (quality h2) of
> EQ -> case h1 of
> StraightFlush c1 -> compare c1 (cards h2)
> FourOfAKind r1 c1 ->
> case compare r1 (rank h2) of
> EQ -> compare c1 (cards h2)
> other -> other
> ...
> other -> other
>
What I'd really like to do is collapse the three types of comparison (i.e. -
hand, rank hand, rank minorrank hand) into one comparison each.
Thanks,
<mike
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20111018/48350422/attachment.htm>
More information about the Beginners
mailing list