Есть ли что-то, о чем я должен помнить, изучая F #, предварительно изучив Scheme?Какие-нибудь различия в методологиях, ошибках или других вещах, которые могут доставить мне неприятности?
Статическая типизация является основным отличием между Scheme и F #.Это облегчает стиль, называемый типизированное программирование , где система типов используется для кодирования ограничений на функции и данные таким образом, что компилятор доказывает, что эти аспекты программы корректны во время компиляции и любые нарушения ограничений обнаруживаются немедленно.
Например, последовательность из одного или нескольких элементов одного типа может передаваться значением следующего типа:
type list1<'a> = List1 of 'a * 'a list
let xs = List1(1, [])
let ys = List1(2, [3; 4])
Компилятор теперь гарантирует, что любая попытка использоватьпустой один из этих последовательностей будет пойман во время компиляции как ошибка.
Теперь, функция reduce
не имеет смысла для пустой последовательности, поэтому встроенная реализация для списков barfs во время выполнения сисключение, если он встречает пустую последовательность:
> List.reduce (+) [];;
System.ArgumentException: The input list was empty.
Parameter name: list
at Microsoft.FSharp.Collections.ListModule.Reduce[T](FSharpFunc`2 reduction, FSharpList`1 list)
at <StartupCode$FSI_0271>.$FSI_0271.main@()
Stopped due to error
С нашей новой последовательностью из одного или нескольких элементов мы можем теперь написать функцию reduce
, которая никогда не преграждает во время выполнения с исключением, потому что ее вводгарантируется непустой системой типов:
let rec reduce f = function
| List1(x, []) -> x
| List1(x0, x1::xs) -> f x0 (reduce f (List1(x1, xs)))
Это отличныйМожно повысить надежность программного обеспечения за счет устранения источников ошибок времени выполнения, и это то, что динамически типизированные языки, такие как Scheme, не могут даже начать делать.