Если вы только начали изучать F #, то может быть полезно попытаться реализовать это явно, используя сначала рекурсию.Как указывает Анкур, этот конкретный рекурсивный паттерн фиксируется List.fold
, но очень полезно понять, как на самом деле работает List.fold
.Итак, явная версия будет выглядеть следующим образом:
// Takes vectors to be processed and an initial list of weights.
// The result is an adapted list of weights.
let rec processVectors weights vectors =
match vectors with
| [] ->
// If 'vectors' is empty list, we're done and we just return current weights
weights
| head::tail ->
// We got a vector 'head' and remaining vectors 'tail'
// Adapt the weights using the current vector...
let weights2 = newweights weights head
// and then adapt weights using the remaining vectors (recursively)
processVectors weights2 tail
Это, по сути, то, что делает List.fold
, но может быть легче понять это, если вы видите код, написанный следующим образом (функция List.fold
скрывает рекурсивную обработку, поэтому лямбда-функция, используемая в качестве аргумента, является просто функцией, которая вычисляет новые веса).
Кроме того, я не совсем понимаю вашу newMatrix
функцию.Можете ли вы дать более подробную информацию об этом?Как правило, при работе со списками вам не нужно использовать индексацию, и кажется, что вы делаете что-то, что требует доступа к элементам по определенному индексу.Там может быть лучший способ написать это ....