Итак, ваш первый пример ничего не возвращает, и это потому, что вы вызываете printfn, которая печатает на консоль, а не возвращает ваши типы.Здесь e :: li представляет список, где e - голова, а li - остальная часть списка.:: здесь позволяет компилятору знать, что вы хотите деконструировать список.
//fully annotated
let s (l: float list) :float =
l.Head
//here the types can be inferred without any annotation
let rec sumlist l =
match l with
| [] -> 0.0
| e::li -> e + sumlist li
s [0.7]
//returns 0.7
sumlist [0.4;0.5;0.6]
//returns 1.5
В моем первом примере, если вы попытаетесь удалить аннотации типов, вы заметите, что получаете ошибку.Это потому, что тип l.Head неоднозначен, иначе вы вызывали l.Head в списке строк, с плавающей точкой?В предоставленной мною функции суммирования вы можете видеть, что мне не нужно аннотировать, и это потому, что я добавляю их, и это ограничивает типы.
Лично при запуске я настоятельно рекомендую всегда комментировать типы.(l : float list)
или (l: list<float>)
- это способ сказать, что мой ввод является списком с плавающей точкой, а :float
в конце, как мы говорим, тип возвращаемого значения - это с плавающей точкой.Вы заметите, что я поместил ключевое слово rec в нашу рекурсивную функцию, лучше явно объявить всякий раз, когда вы создаете рекурсивную функцию.