Hi everybody,

I'm working on a module that encodes "static" facts about "the real world".  For now, I'm working on an ISO 3166 compliant list of countries, country names, and country codes.  I've run into a bit of an optimization issue.

There is a static bijective correspondence between countries and their codes.  In order to keep one just one "large" data structure representation as Haskell code, I encoded this bijection using a list.  I'm looking to write queries against this list, but it is rather tedious.  I figured I could make some Data.Maps to handle it for me.



-- Country and ISOCountryCodes derive (Data, Eq, Ord, Show, Typeable)
countries_and_iso_country_codes :: [ (Country, ISOCountryCode) ]
countries_and_iso_country_codes =  
        
        [ ( Afghanistan                           , ISOCountryCode  AF     AFG    (isoNumericCode 004) )
        , ( AlandIslands                    , ISOCountryCode  AX    ALA    (isoNumericCode 248) )
        , ( Albania                            , ISOCountryCode  AL    ALB    (isoNumericCode 008) )
...
        , ( Zimbabwe , ISOCountryCode ZW ZWE (isoNumericCode 716) ) ]

map_country_to_country_code :: Map Country ISOCountryCode
map_country_to_country_code = fromList countries_and_iso_country_codes

map_country_code_to_country :: Map ISOCountryCode Country
map_country_code_to_country = fromList . fmap (\(a,b) -> (b, a)) $ countries_and_iso_country_codes

Is there anyway to instruct GHC (and maybe other compilers) to compute these maps statically? Are GHC and the other compilers smart enough to do it automatically? Although the list isn't huge, I would still rather get rid of the O(2*n) operation of turning it into maps at run-time. (Especially since some later list encodings like these might be enormous) What should I be looking into?

Thanks