2010-02-08 7 views
4

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

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

Также почему они предоставляют cos, sin и т. Д., А не Math.Cos, Math.Sin?

ответ

7

F # может иметь functions с областью действия modules (вместо классов).

Среда CLR реализует эти, внутренне, как:

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

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

+0

Спасибо, Рид. Вы знаете, почему они решили сделать это для математических функций. Или вы имеете в виду, что в F # нет типа.method? Все функции (объект)? –

+1

@Joan: F # имеет * длинный * наследство. Эти вещи унаследованы от OCaml. У F # есть вызовы методов, подобные C#. –

+0

Спасибо Mehrdad. Последний вопрос: почему CLR настроен так, что он не может иметь истинные свободные функции, но должен подделать его со статическим классом? Просто интересуюсь. –

7

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

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

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

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

+1

Другая причина в том, что 'cos' может быть реализована с помощью аргументов типа F #, а не с чередующимися аргументами, что позволяет использовать приложение частичной функции, которое' Math.Cos' не поддерживает. –

+2

@Joel - можете ли вы расширить то, что вы имеете в виду? Как и все однозначные функции .NET, 'System.Math.Cos' может использоваться как' _ -> _', как 'cos'. Если потребовалось несколько аргументов, то вы были бы правы. – kvb

+0

Спасибо kvb. Итак, F # cos - другой метод, отличный от Math.Cos? Где теперь полное имя для F # cos? CommonInvisibleStaticClass.Cos? Или cos был определен для всего в F #, как вы сказали. –

4

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

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

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

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

+0

Спасибо, поэтому я прав, если предположить, что это может быть применено только к статическим функциям? Как вы не можете открыть функции экземпляра, чтобы быть свободными функциями верхнего уровня, не так ли? –

+1

Да, его можно применять только к функциям модулей (которые являются статическими). – Brian

3

Joan,

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

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

А также:

The F# Survival Guide

Там же книга Криса Смита, который является отличным вводный текст.

Programming F#

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

Смежные вопросы