[Haskell-beginners] Collapsing multiple case branches?

Thomas Davie tom.davie at gmail.com
Sat Jan 3 15:04:49 EST 2009


Hi Colin,

northernRange :: PieceType > Int -- note the camel case, that's  
traditional in Haskell circles
northernRange p
   | p `elem` [Lance, ReverseChariot, VerticalMover ....] = 11
   | p `elem` [Bishop, Kylin,....] = 0
   | otherwise = 1

These are called "pattern guards" – you can put any boolean expression  
in them.

Of note, if you provide an Enum instance for PieceType you may really  
be able to do this:

northernRange p
   | p `elem` [Lance..SoaringEagle] = 11
   | p `elem` [Bishop..HornedFalcon] = 0
   | otherwise = 1

Finally, my guess is that you probably want a much more general type  
for PieceType that doesn't need extended every time you add a Piece to  
your game (and similarly doesn't need every function in your program  
extended at the same time).  Perhaps something like this:

data Piece = Piece { name :: String, northernRange :: Int }

With elements like:

lance = Piece "Lance" 11

or like:

reverseChariot = Piece {name = "Reverse chariot", northernRange = 11}


Bob

On 3 Jan 2009, at 20:56, Colin Paul Adams wrote:

> I have the following function:
>
> northern_range:: Piece_type -> Int
> northern_range piece =
>    case piece of
>      Lance -> 11
>      Reverse_chariot -> 11
>      Vertical_mover -> 11
>      White_horse -> 11
>      Rook -> 11
>      Promoted_rook -> 11
>      Promoted_gold_general -> 11
>      Promoted_silver_general -> 11
>      Free_king -> 11
>      Promoted_phoenix -> 11
>      Flying_stag -> 11
>      Flying_ox -> 11
>      Whale -> 11
>      Dragon_king -> 11
>      Soaring_eagle -> 11
>      Bishop -> 0
>      Kylin -> 0
>      Lion -> 0
>      Promoted_kylin -> 0
>      Blind_tiger -> 0
>      Promoted_ferocious_leopard -> 0
>      Free_boar -> 0
>      Horned_falcon -> 0
>      _ -> 1
>
> I'd prefer to write this as just three lines (one for each of the
> three resulting values), something like this:
>
> northern_range:: Piece_type -> Int
> northern_range piece =
>    case piece of
>      Lance, Reverse_chariot, Vertical_mover, etc. -> 11
>      Bishop, Kylin, etc. -> 0
>      _ -> 1
>
> Is there some syntax to do this sort of thing?
> -- 
> Colin Adams
> Preston Lancashire
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners



More information about the Beginners mailing list