Функция F # связывает одно значение единственного выражения в своем теле (то есть, то, которое следует последним после всех let
-привязок, проще говоря. В вашем случае это выражение
for i=0 to 25 do
printf "%f" (percent ((count myList.[i] str) (lowerCases str)))
Он имеет тип unit
, что означает, что он не возвращает ничего полезного, кроме специального значения ()
, в то время как привязка let frequency ... : float =
говорит, что он возвращает float
. Отсюда ошибка.
printf
уже печатает на консоль. Вероятно, вам нужно:
let frequency(str:string) : unit =
let myList = ['a'..'z']
for i=0 to 25 do
printf "%f" (percent ((count myList.[i] str) (lowerCases str)))
do frequency "hello world"
Идиоматично опускать аннотацию : unit
в такой функции и позволить компилятору выводить тип возвращаемого значения. Этот код не отображаетF # слава, естественно, но выполняет свою работу.
Поскольку кажется, что вы изучаете язык, вот упражнение, возможно, на будущее. Ваша функция объединяет вычисление частоты букв и печать их, а функциональное программирование - это все о композиции. Что делать, если вы хотите отобразить результат в окне вместо его вывода на консоль или отформатировать его иначе?ently?Попробуйте написать две функции: одна возвращает структуру данных с частотами букв, а другая печатает ее.