У меня есть вложенный словарь Map<'a,Map<'b,'T>>
, поэтому для комбинации a*b
запись является уникальной.
Для эффективного предварительного вычисления мне потребуется инвертировать ключи в Map<'b,Map<'a,'T>>
У меня есть несколько методов более высокого порядка, которые выполняют эту работу (|/>
будет применять операцию ввложенная последовательность |//>
такая же, но с 2 уровнями глубины, |*>
будет перечислять декартово произведение вложенной последовательности), но мне интересно, есть ли лучший способ сделать это, на случай, если есть красивый код, которым можно поделиться навот этот.
let reversenmap (x:Map<'a,Map<'b,'T>>) :Map<'b,Map<'a,'T>> =
let ret = x |> Map.toSeq |/> Map.toSeq |*> squash12
let ret2 = ret |> Seq.groupByn2 (fun (a,b,t) -> b)
(fun (a,b,t) -> a) |//> Seq.head
|//> (fun (a,b,c) -> c)
ret2 |> Seq.toMapn2