Как мне рекурсивно распечатать строки из текстового файла вместе со средним значением общего количества элементов в строке?

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

Образцы текстовых строк

2009    1.3     3.51    6.76    5.80    4.48    5.47    2.06    4.3 0.54    7.69    1.27    2.9
2008    3.53    3.71    1.88    2.46    4.63    4.88    4.53    1.51    10.83   2.7 1.28    6.51
2007    2.88    2.19    3.55    3.95    2   3.1 4.18    8.76    1.91    2.01    1.67    3.54
2006    3.48    1.33    3.16    3.87    3.19    3.87    4.24    7.12    4.32    6.63    2.97    3.37
2005    5.32    2.41    1.76    1.63    1.78    1.07    2.07    1.44    2.68    1.14    2.15    1.38
2004    1.09    0.75    3.93    1.9 5.57    2.94    4.46    5.01    0.86    2.42    5.02    1.75

....

Теперь у меня есть пара функций, которые я хочу вам показать. К сожалению, моя функция печати выводит только первую строку.

let rec print year values =
  if values = [] then
    ()
  else
    printfn ""
    printfn "%A: %A" year values

и вторая функция, которая отлично справляется с суммой элементов, но я не могу заставить ее правильно разделить ее на 12 элементов.

let sum (values: double list) =
let rec sum values accum =
    match values with
    | [] -> accum
    | head :: tail -> sum tail (accum + head) / 12.0 // would 12.0 work right?
sum values 0.0

в основном

  let (year, values) = ParseLine file.Head
  printfn "%A: %A" print (year (sum values)) // year gets the error, according to visual studio

person CR9191    schedule 13.02.2015    source источник
comment
Это напоминает мне проект, который я делал с XSLT. Доказуемая правильность звучит великолепно, пока вы не обнаружите, насколько нелогичны функциональные языки. Удачи.   -  person Peter Wone    schedule 13.02.2015
comment
Я подозреваю, что деление на 12 должно быть sum tail (accum + head/12.0). Или вы могли бы просто сделать [] -> accum/12.0   -  person John Palmer    schedule 13.02.2015
comment
Работает, спасибо!   -  person CR9191    schedule 13.02.2015


Ответы (1)


Спасибо Джону Палмеру, который опубликовал быстрое решение. фиксированный код

let sum (values: double list) =
let rec sum values accum =
    match values with
    | [] -> accum
    | head :: tail -> sum tail (accum + head/12.0)
sum values 0.0
person CR9191    schedule 13.02.2015