Извлечение Листа соединяет каналом от дерева не в F#

Вы должны загрузить ThingworxPersistenceProvider Thing и использовать GetConfigurationTable («ConnectionInformation»), который имеет только одну строку и столбец jdbcUrl, где он находится.

6
задан Community 23 May 2017 в 11:48
поделиться

2 ответа

относительно Вашего вопроса об обходе списка - можно запустить путем записи функции, которая возвращает списки, которые представляют путь - это, я думаю легче, и это будет позже легкий превратить его в функцию, которая возвращает число.

Этот берет список в качестве первого аргумента (путь до сих пор) и дерево и возвращает список> тип - который является всеми возможными путями от текущего ответвления.

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]  

Вместо того, чтобы связать списки, мы теперь вычисляем число.

5
ответ дан 17 December 2019 в 00:16
поделиться

Относительно лени - можно сделать это ленивым при помощи типа 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 для нахождения первого значения, которое представляет результат.

2
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: