我有一個嵌套字典Map<'a,Map<'b,'T>>
,所以對於a*b
的組合,條目是唯一的。在f#Map <'a,Map <'b,'T>>中反轉嵌套字典) - > Map <'b,Map <'a,'T>>
爲了有效地預先計算,我需要反轉在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
序列表達式使枚舉非常自然。有非標準的運營商確實是一個劣質的解決方案。 – nicolas 2012-03-22 13:35:44
序列表達式不應該使用'seq {...}'而不是'[...]'?這提醒我,'seq {1..5}'和'{1..5}'之間是否有實際區別? – 2012-03-22 16:41:17
@JoelMueller你的意思是'[1..5]'而不是'{1..5}'?如果是這樣,差異在於所得到的類型和評估方法。 'seq {...}'返回一個'seq <'a>'並且被延遲評估,就像'IEnumerable'(其中它是一個別名)。 '[...]'返回一個'列表'並立即評估。你可以返回一個無限長的'seq <'a>',但是你不能用''list''來完成。 –
2012-03-23 02:57:40