Подтвердить что ты не робот

Должны ли функции F # размещаться в модулях, классах или другой структуре?

Я начинаю код в F # и вызываю функции из функций с функциями в качестве параметров - в Интернете есть много ресурсов для обучения. Теперь я пытаюсь собрать фрагменты во что-то большее, чем просто набор функций. К сожалению, я не нахожу много ресурсов, связанных со структурой, дизайном или даже тем, как "биты" соединяются вместе.

Я нашел ключевое слово namespace (например, namespace MyOnlyNamespace), но получаю ошибку компилятора для функций, которые я разместил внутри пространства имен:

Пространства имен не могут содержать значения. Рассмотрите возможность использования модуля для хранения объявлений значений.

Когда я добавляю module CoolFunctions, я получаю

Неожиданное начало структурированной конструкции в определении. Ожидаемый '=' или другой токен

Итак, у меня есть многочастный вопрос (но, пожалуйста, ответьте на любую часть, которую вы можете)

  • Что такое модуль?
  • Это как класс (что-то вроде модуля VB.NET) или это что-то еще совсем?
  • Если что-то еще, то есть классы в F #?
  • Существуют ли другие структуры, которые я должен использовать вместо этого?
  • Как объявить модуль?
4b9b3361

Ответ 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 =
    ....