Должны ли функции F # размещаться в модулях, классах или другой структуре?
Я начинаю код в F # и вызываю функции из функций с функциями в качестве параметров - в Интернете есть много ресурсов для обучения. Теперь я пытаюсь собрать фрагменты во что-то большее, чем просто набор функций. К сожалению, я не нахожу много ресурсов, связанных со структурой, дизайном или даже тем, как "биты" соединяются вместе.
Я нашел ключевое слово namespace
(например, namespace MyOnlyNamespace
), но получаю ошибку компилятора для функций, которые я разместил внутри пространства имен:
Пространства имен не могут содержать значения. Рассмотрите возможность использования модуля для хранения объявлений значений.
Когда я добавляю module CoolFunctions
, я получаю
Неожиданное начало структурированной конструкции в определении. Ожидаемый '=' или другой токен
Итак, у меня есть многочастный вопрос (но, пожалуйста, ответьте на любую часть, которую вы можете)
- Что такое модуль?
- Это как класс (что-то вроде модуля VB.NET) или это что-то еще совсем?
- Если что-то еще, то есть классы в F #?
- Существуют ли другие структуры, которые я должен использовать вместо этого?
- Как объявить модуль?
Ответы
Ответ 1
Чтобы дать некоторые конкретные рекомендации по выбору между пространствами имен, модули abd классов в F #:
-
Если вы пишете функции с помощью let
, которые, как ожидается, будут использоваться из F #, то лучший выбор для их размещения внутри модуля. Это дает вам API, похожий на List.map
и другие базовые функции F #.
Что касается именования, вы должны использовать camelCase
, если вы не ожидаете, что пользователи С# также вызовут функции. В этом случае вы должны использовать PascalCase
(и обратите внимание, что модуль будет скомпилирован в статический класс).
-
Если вы пишете декартации типов, их обычно следует помещать в пространство имен. Они также допускаются внутри модулей, но затем они будут скомпилированы как вложенные классы.
-
Если вы пишете классы F #, они также должны быть помещены в пространства имен. В общем случае, если вы пишете код F #, который будет вызываться С#, то использование классов - лучший механизм, так как вы получите полный контроль над тем, что увидит пользователь (класс F # скомпилирован только для класса).
Если у вас есть файл, он может начинаться с namespace Foo.Bar
или module Foo.Bar
, который помещает весь код в файл внутри пространства имен или модуля. Вы можете всегда вставлять больше модулей внутри этого объявления верхнего уровня. Общий шаблон - начать с одного namespace
, а затем включить в файл некоторые объявления типов и модулей:
namespace MyLibrary
type SomeType =
// ...
module SomeFuncs =
let operation (st:SomeType) = // ...
Ответ 2
относительно дизайна компонентов F # есть очень хороший проект онлайн.
JPalmer allready указал вам на синтаксические проблемы, но я думаю, что некоторые другие вопросы заслуживают большего:
Что такое модуль?
Да JPalmer прав - модули скомпилированы в статические классы, но мы действительно заботимся внутри F #?
IMHO вы должны использовать больше модулей, чем классы при программировании в F #.
В ООП вы определяете свои классы и методы внутри.
В FP вы определяете простые типы (без поведения) и набор функций для их преобразования. И естественным местом для сбора этих функций является модуль.
Это как класс (что-то вроде модуля VB.NET) или он что-то еще?
Модуль VB действительно является хорошим сравнением.
Если что-то еще, то есть классы в F #?
Да, вы можете использовать классы в F # - это полный .net languague и .net - OOP. Вы можете делать практически все в F #, которое вы могли бы сделать на С# VB.net(только в некоторых случаях общие ограничения могут быть болью)
Существуют ли другие структуры, которые я должен использовать вместо этого? Нет - собирайте свои функции в модули, но, конечно, используйте записи и абстрактные типы данных для ваших данных.
Как объявить модуль?
Посмотрите онлайн-документы: Модули (F #) - там вы найдете все, что вам нужно.
Ответ 3
Что такое модуль:
Модуль скомпилирован до статического класса. Но я думаю, что модули аналогичны пространствам имен в С#
существуют классы в F # - используйте
type SomeType(constructor,args) =
....
Если у вас
namespace Name
module Mod
....
это не скомпилируется - как вы знаете, вы можете использовать несколько альтернатив
module Namespace.Module
в качестве первой строки в файле
или
namespace Name
module Mod =
....