Поскольку msgDiagram1
и msgDiagram
имеют разные типы, вы не можете использовать одну и ту же функцию loop
для них.Одним из быстрых решений является обработка по-другому на msgDiagram1
:
let listToString lst =
let rec loop acc = function
| [] -> acc
| (lbl, diag)::xs ->
match diag with
| [] -> loop (acc + string lbl + "\n") xs
| _ ->
let s = diag |> List.map (fun (label, _) -> "..." + label)
|> String.concat "\n"
loop (acc + string lbl + "\n" + s + "\n") xs
loop "" lst
Вы выбрали неверную структуру данных для задания;следовательно, вы не можете представить более двух уровней диаграмм, и эти уровни вынуждены иметь разные типы.Правильный инструмент для использования здесь - это рекурсивная древовидная структура данных:
type Diagram = Branch of string * Diagram list
Теперь вышеуказанные значения могут быть определены с использованием того же типа Diagram list
:
let msgDiagram1 = [ Branch ("msg03",[]); Branch ("msg04", []) ]
let msgDiagram = [ Branch ("msg01", []); Branch ("msg02", msgDiagram1);
Branch ("msg05", []) ]
и listToString
может бытьпереписан для обработки Diagram list
рекурсивно в одной партии.