Skip to content

Instantly share code, notes, and snippets.

@mattpodwysocki
Created April 9, 2009 22:40
Show Gist options
  • Save mattpodwysocki/92791 to your computer and use it in GitHub Desktop.
Save mattpodwysocki/92791 to your computer and use it in GitHub Desktop.
#light
[<AutoOpen>]
module Operators =
let (||>) (x, y) f = f x y
module Map =
let transposeCombine m =
(Map.empty, m) ||> Map.fold_left (fun acc k1 m' ->
(acc, m') ||> Map.fold_left (fun acc' k2 v ->
acc'
|> Map.add k1 (Map.add k2 v (defaultArg (acc' |> Map.tryfind k1) Map.empty))
|> Map.add k2 (Map.add k1 v (defaultArg (acc' |> Map.tryfind k2) Map.empty))
))
type City =
| Boise | LosAngeles | NewYork | Seattle
| StLouis | Phoenix | Boston | Chicago
| Denver
let distTweenCities =
Map.of_list
[
(Boise, Map.of_list [(Seattle, 496);(Denver, 830);(Chicago, 1702)]);
(Seattle, Map.of_list [(LosAngeles, 1141);(Denver, 1321)]);
(LosAngeles, Map.of_list [(Denver, 1022);(Phoenix, 371)]);
(Phoenix, Map.of_list [(Denver, 809);(StLouis, 1504)]);
(Denver, Map.of_list [(StLouis, 588);(Chicago, 1009)]);
(Chicago, Map.of_list [(NewYork, 811);(Boston, 986)]);
(StLouis, Map.of_list [(Chicago, 300)]);
(Boston, Map.of_list [(StLouis, 986)]);
(NewYork, Map.of_list [(Boston, 211)])
]
|> Map.transposeCombine
let printValues (m:Map<City, Map<City, int>>) =
m |> Seq.iter(fun kvp -> printf "%A\t" kvp.Key; kvp.Value |> Seq.iter(fun kvp' -> printf "%A\t%d" kvp'.Key kvp'.Value); printfn "")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment