Это невозможно.
Вы не можете получить доступ к внутренним вычислениям из другой функции. Что вам нужно сделать, это вернуть значения, которые вам нужно использовать снаружи.
В вашем случае ваша функция InputStudents
имеет следующую подпись:
(string * int list) list -> (string * int list) list
Это означает, что он возвращает список с именем и примечаниями каждого учащегося. average
рассчитывается, но затем теряется, потому что нигде не используется. Если вы хотите иметь возможность распечатать его в другой функции, вам нужно включить его как часть возвращаемого значения:
...
let name = data.[0]
let scores = [float data.[1]
float data.[2]
float data.[3] ]
//calculating the average by for the 3 exam scores
let average = List.average scores
InputStudents ((name, scores, average) :: students)
теперь подпись такая:
(string * float list * float) list -> (string * float list * float) list
указывает на то, что для каждого студента возвращается кортеж, который включает имя, заметки и среднее значение.
Теперь обратимся к функции PrintAverages
.
У функции есть проблема: она вызывает InputStudents
и вызывает себя рекурсивно. Что вы хотите сделать, это позвонить сначала InputStudents
, а затем передать результат в PrintAverages
:
InputStudents [] |> PrintAverages
Также в своем заявлении match
вы можете распаковать полученный вами кортеж. Прямо сейчас у вас есть e::rest
, который дает вам один элемент и остальную часть списка. Этот элемент будет иметь тип string * float list * float
, который можно распаковать так:
let name, notes, average = e
или непосредственно в операторе match
:
match L with
| [] -> ()
| (name, notes, average) :: rest ->