Я не совсем уверен, что понимаю ваш вопрос - было бы весьма полезно привести конкретный пример с некоторыми данными и скриншотом листа Excel, который вы пытаетесь получить.
Однако идея использования ID для моделирования отношений между родителями и детьми (если это то, что вы пытаетесь сделать) не звучит как лучший функциональный подход. Я полагаю, вы пытаетесь представить что-то вроде этого:
First Row
Foo Bar
Foo Bar
Second Row
More Stuff Here
Some Even More Neste Stuff
Это может быть представлено с использованием рекурсивного типа, который содержит список элементов в текущей строке и затем список дочерних строк (которые сами могут содержать дочерние строки):
type Row = Row of list<string> * list<Row>
Затем вы можете обработать структуру, используя рекурсивную функцию. Примером значения (представляющего первые три строки из приведенного выше примера) может быть:
Row( ["First"; "Row"],
[ Row( ["Foo"; "Bar"], [] )
Row( ["Foo"; "Bar"], [] ) ])
РЕДАКТИРОВАТЬ: Вышеуказанный тип Row
будет полезен, если у вас есть произвольное вложение. Если у вас есть только два слоя (штаты и города), то вы можете использовать список списков. Другой список, содержащий название штата вместе с вложенным списком, который содержит все города в этом штате.
Если вы начинаете с двух списков, то вы можете использовать несколько функций F #, чтобы превратить ввод в список списков:
let states = [ ("WA", "Washington"); ("CA", "California") ]
let cities = [ ("WA", "Seattle"); ("WA", "Redmond"); ("CA", "San Francisco") ]
cities
// Group cities by the state
|> Seq.groupBy (fun (id, name) -> id)
|> Seq.map (fun (id, cities) ->
// Find the state name for this group of cities
let _, name = states |> Seq.find (fun (st, _) -> st = id)
// Return state name and list of city names
name, cities |> Seq.map snd)
Затем вы можете рекурсивно перебирать вложенные списки (в приведенном выше примере они фактически являются последовательностями, поэтому вы можете превратить их в списки с помощью List.ofSeq
) и сохранять индекс текущей строки и столбца.