Search code examples
haskelltypesgeneric-programming

Grouping data types by constructor in Haskell


Given this data type

data Val = X Int | Y Bool | Z Double deriving (Eq, Show)

and a list such as

let vals = [X 1, Z 2.7, Y True, X 2, Z 3.14, Y True]

how to group elements in vals into this list,

[[X 1,X 2],[Y True,Y True],[Z 2.7, Z 3.14]]

Solution

  • I've the following:

    data Val = X Int | Y Bool | Z Double deriving (Eq, Ord, Show)
    
    vals :: [Val]
    vals = [X 1, Z 2.7, Y True, X 2, Z 3.14, Y True]
    
    valCtorEq :: Val -> Val -> Bool
    valCtorEq (X _) (X _) = True
    valCtorEq (Y _) (Y _) = True
    valCtorEq (Z _) (Z _) = True
    valCtorEq _ _ = False
    

    And then:

    *Main Data.List> groupBy valCtorEq $ sort vals
    [[X 1,X 2],[Y True,Y True],[Z 2.7,Z 3.14]]