Вот пример, чтобы показать, как вы можете напрямую декомпозировать кортеж, используя шаблоны в аргументах лямбда-функции, как вы можете использовать дискриминаторы (City, Roads) в качестве функций и как использовать конвейерную обработку, чтобы код можно было прочитать как алгоритм .
- Из данных
- Сопоставить каждый (строка * список строк) кортеж из списка с (City, Set) кортежем
- Конвертировать полученный список в набор
- Конвертировать полученный набор в RoadMap
(строка * список строк) список -> RoadMap
let MakeRoadMap data =
data
|> List.map (fun (str, lst) -> (City str, lst |> List.map City |> Set.ofList))
|> Map.ofList
|> Roads
Мы также могли использовать оператор композиции функций и не указывать аргумент функции, тип которого может быть выведен.
let makeRoadMap =
List.map (fun (str, lst) -> (City str, lst |> List.map City |> Set.ofList))
>> Map.ofList
>> Roads
То же самое для функции upToManySteps
let rec upToManySteps roadMap steps city =
match roadMap, steps with
| _, n when n < 0 -> invalidArg "steps" "Must be positive"
| _, 0 -> Set.empty |> Set.add city
| Roads map, 1 -> map |> Map.find city
| Roads map, n -> map
|> Map.find city
|> Seq.map (fun x -> upToManySteps roadMap (steps - 1) x)
|> Set.unionMany