Как упомянул Рид, функции могут быть определены в модулях, например, в других языках ML, но они также могут быть определены в типах, таких как другие языки .NET (и фактически модули также компилируются в классы). В F # модули могут быть open
ed для доступа к функциям без необходимости каждый раз использовать имя модуля, и модули автоматически создаются для каждого файла отдельно, если они явно не объявлены.
Относительно того, почему существуют отдельные функции cos
и т. Д. Вместо простого использования встроенных в .NET Math.Cos
и т. Д., Вероятно, есть несколько причин:
- Uniformity:
cos
выглядит гораздо более идиоматично в F #, чем вызов статического метода System.Math.Cos
.
- Статические ограничения:
cos
не только работает на float
s в F #, но также работает на float32
s и на любом типе, который предоставляет статический метод Cos
, так что вы можете создавать свои собственные типы к которому может быть применена функция cos
.
Я предполагаю, что по-настоящему бесплатные функции недопустимы, потому что есть много языков .NET, которые не предоставляют удобный доступ к ним, поэтому их использование создаст барьер для межъязыковой совместимости. Сам CLR поддерживает свободные функции, и некоторые языки, такие как C ++ / CLI, используют их, но большинство языков компилируют функции в классы (даже если это не так, как выглядит с точки зрения исходного кода, как в F #).