Better yielding tuple-d union case values in list generation
Why not use nested loops?

let OreDataMap = 
    [
        for common in [ Common; Uncommon; Rare ] do
            for compressed in [ IsCompressed; IsNotCompressed] do
                for oreType in FSharpType.GetUnionCases typeof&lt;EveOnline.OreDomain.Types.OreType&gt; do
                    let ore = FSharpValue.MakeUnion (oreType, [| |]) |&gt; unbox
                    yield (RawOreName ore).Value, (ore, common, compressed)
    ]
    |&gt; Map.ofList


That's probably the idiomatic way, but if you don't like excessive indentation you can always align your successive for loops - I think this looks nicer. Also, you can replace the last do with -&gt; to eliminate the need for the yield keyword.

let OreDataMap = 
    [
        for common in [ Common; Uncommon; Rare ] do
        for compressed in [ IsCompressed; IsNotCompressed] do
        for oreType in FSharpType.GetUnionCases typeof&lt;EveOnline.OreDomain.Types.OreType&gt; -&gt;
            let ore = FSharpValue.MakeUnion (oreType, [| |]) |&gt; unbox
            (RawOreName ore).Value, (ore, common, compressed)
    ]
    |&gt; Map.ofList