Есть ли у F # бесплатные функции? - PullRequest
4 голосов
/ 08 февраля 2010

Должна ли каждая функция быть внутри типа как в C #? Или у F # есть свободные функции?

А как насчет функций, которые я видел во всем коде F #, таких как, cos, sin и т. Д. Они вызывают Math.Cos, Math.Sin?

Кроме того, почему вместо Math.Cos, Math.Sin они предоставили cos, sin и т. Д., Например? 1005 *

Ответы [ 4 ]

7 голосов
/ 08 февраля 2010

Как упомянул Рид, функции могут быть определены в модулях, например, в других языках ML, но они также могут быть определены в типах, таких как другие языки .NET (и фактически модули также компилируются в классы). В F # модули могут быть open ed для доступа к функциям без необходимости каждый раз использовать имя модуля, и модули автоматически создаются для каждого файла отдельно, если они явно не объявлены.

Относительно того, почему существуют отдельные функции cos и т. Д. Вместо простого использования встроенных в .NET Math.Cos и т. Д., Вероятно, есть несколько причин:

  1. Uniformity: cos выглядит гораздо более идиоматично в F #, чем вызов статического метода System.Math.Cos.
  2. Статические ограничения: cos не только работает на float s в F #, но также работает на float32 s и на любом типе, который предоставляет статический метод Cos, так что вы можете создавать свои собственные типы к которому может быть применена функция cos.

Я предполагаю, что по-настоящему бесплатные функции недопустимы, потому что есть много языков .NET, которые не предоставляют удобный доступ к ним, поэтому их использование создаст барьер для межъязыковой совместимости. Сам CLR поддерживает свободные функции, и некоторые языки, такие как C ++ / CLI, используют их, но большинство языков компилируют функции в классы (даже если это не так, как выглядит с точки зрения исходного кода, как в F #).

7 голосов
/ 08 февраля 2010

F # может иметь функции , ограниченные в модулях (вместо классов).

CLR реализует их внутренне, как:

как класс общеязыковой среды выполнения (CLR), имеющий только статические члены

Они выглядят как «свободные функции» в пределах модуля.

4 голосов
/ 08 февраля 2010

@ Ответ Рида хорош. Я просто хотел добавить, что в F # вы можете «открывать» модули так, чтобы связанные с модулями функции можно было вызывать неквалифицированным способом, и именно отсюда берутся различные функции и операторы «верхнего уровня», например,

http://msdn.microsoft.com/en-us/library/ee353754(VS.100).aspx

То есть F # по-прежнему подчиняется механизмам CLR, что означает, что каждая функция должна быть в классе, но модули F # отображаются на статические классы в CLR, модули могут быть «открыты», чтобы обеспечить функции сверху уровень и несколько модулей «автоматически открываются», так что наиболее распространенные / удобные функции доступны сразу.

Наличие множества общих доступных функций очень полезно для сценариев или интерактивных сессий, когда вам не нужно открывать кучу пространств имен или излагать 15 символов «System.Math.Cos» только для вычисления косинус.

3 голосов
/ 09 февраля 2010

Joan

Вместо того, чтобы отвечать на все эти вопросы о том, какие функции F # поддерживает или не поддерживает, возможно, вам лучше начать с книги по F #. Рассмотрим эти два ресурса в качестве отправной точки:

http://en.wikibooks.org/wiki/F_Sharp_Programming

А также:

Руководство по выживанию F #

Есть также книга Криса Смита, которая является превосходным вводным текстом.

Программирование F #

Может быть, вы хотите прочитать их и проработать их, а затем можете задавать более конкретные вопросы. Просто идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...