Egison advocates a pattern-match oriented style of programming and offers poker hands as an example:

def suit := algebraicDataMatcher
| heart
| club
| diamonddef card := algebraicDataMatcher
| card suit (mod 13)def poker cs :=
match cs as multiset card with
| [card  $n, card #n, card #n, card #n, ] -> "Four of a kind" | [card$m, card  #m, card  #m, card  $n, card #n] -> "Full house" ... | [, , , , _] -> "Nothing" Note match ... as multiset ... which allows us to match without regard to the order of the input data. The syntax to bind variables ($n) in patterns and thence refer to them (#n) is elegant.

The Curry tutorial gives the poker hand problem as an example as well:

{-# OPTIONS_CYMAKE -F --pgmF=currypp --optF=defaultrules #-}data Suit = Club | Spade | Heart | Diamonddata Rank = Ace | King | Queen | Jack | Ten | Nine | Eight
| Seven | Six | Five | Four | Three | Two
deriving (Eq)data Card = Card Rank Suitrank (Card r _) = rhand (x++[]++z) | map rank (x++z) == [r,r,r,r] = Just "Four of a kind" where r free
hand (x++[a]++y++[b]++z) | map rank (x++y++z) == [r,r,r] && rank a == rank b = Just "Full house" where r free
...
hand'default  = Nothing

This uses functional logic programming (note the where ... free clause); lists are ordered and Curry gives us no relief from this, but it is clearer than solutions in functional programming. Logic programming allows us to recover some of Egison's pattern-matching functionality in a more principled manner.