Вы должны загрузить ThingworxPersistenceProvider Thing и использовать GetConfigurationTable («ConnectionInformation»), который имеет только одну строку и столбец jdbcUrl, где он находится.
относительно Вашего вопроса об обходе списка - можно запустить путем записи функции, которая возвращает списки, которые представляют путь - это, я думаю легче, и это будет позже легкий превратить его в функцию, которая возвращает число.
Этот берет список в качестве первого аргумента (путь до сих пор) и дерево и возвращает список> тип - который является всеми возможными путями от текущего ответвления.
let rec visitor lst tree =
match tree with
| Branch(n, sub) -> List.collect (visitor (n::lst)) sub
| Leaf(n) -> [List.rev (n::lst)]
// For example...
> let tr = Branch(1, [Leaf(3); Branch(2, [Leaf(4); Leaf(5)] )]);;
> visitor [] tr;;
val it : int list list = [[1; 3]; [1; 2; 4]; [1; 2; 5]]
В 'Листовом' случае мы просто добавляем текущее число к списку и возвращаем результат как список, содержащий единственный список (мы должны инвертировать его сначала, потому что мы добавляли числа к началу). В случае 'Ответвления' мы добавляем 'n' к списку и рекурсивно звоним посетителю для обработки всех подузлов текущего ответвления. Это возвращает набор списков, и мы используем 'map_concat' для превращения их в единственный список, который содержит все пути posble от текущего ответвления.
Теперь, можно переписать это для возврата списка целых чисел:
let rec visitor2 lst tree =
match tree with
| Branch(n, sub) -> List.collect (visitor2 (lst * 10 + n)) sub
| Leaf(n) -> [lst * 10 + n]
// For example...
> visitor2 0 tr;;
val it : int list = [13; 124; 125]
Вместо того, чтобы связать списки, мы теперь вычисляем число.
Относительно лени - можно сделать это ленивым при помощи типа F# "seq" вместо типа "списка". Вот пример:
let rec visitor2 lst tree =
match tree with
| Branch(n, sub) -> Seq.map_concat (visitor2 (lst * 10 + n)) sub
| Leaf(n) ->
seq { do printfn "--yielding: %d" (lst * 10 + n)
yield lst * 10 + n };;
"seq" вещью является выражение последовательности, которое представляет ленивый поток значений. Я добавил "printfn" к коду, таким образом, мы можем отследить, как вещи выполняются:
> visitor2 0 tr |> Seq.take 2;;
--yielding: 13
--yielding: 124
val it : seq<int> = seq [13; 124]
Можно, вероятно, использовать что-то как Seq.first для нахождения первого значения, которое представляет результат.