兩個地圖我有以下類型:減地圖<'a, int>
type Multiset<'a when 'a: comparison> = MSet of Map<'a, int>
我要聲明的函數這種類型減去2個MSets。
比方說,我有以下兩個多集:
let f = MSet (Map.ofList [("a",1);("b",2);("c",1)])
let g = MSet (Map.ofList [("a",1);("b",3);("c",1)])
現在我已經試圖創造這個減函數,它需要兩個多集。
let subtract fms sms =
match fms with
| MSet fs -> match sms with
| MSet ss ->
let toList ms = Map.fold (fun keys key value -> keys @ [for i = 1 to value do yield key]) [] ms
let fromList l = match l with
| [] -> MSet(Map.ofList [])
| x::xs -> MSet(Map.ofList (x::xs |> Seq.countBy id |> Seq.toList))
let sfList = toList fs
let ssList = toList ss
fromList (List.filter (fun n -> not (List.contains n sfList)) ssList)
如果我運行:
subtract f g
它返回:
MSet (map [])
這是不是我想要的。 g包含一個比f更多的b,所以我想讓它返回:
MSet(map [("b", 1)])
我的實現並沒有考慮同一個鍵的多次出現。我不太清楚我如何解決這個問題,所以我得到了想要的功能?
我學會從這些偉大的答案這麼多,再次感謝你。 – Alexander