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