Предотвращение ошибки, при которой модуль и определение типа встречаются в двух частях сборки

#f#

#f#

Вопрос:

Предположим, у меня есть такой проект, как этот:

 // Types.fs

namespace App

type Foo =
  {
    X : int
  }
 
 // Foo.fs

module App.Foo

let doubleIt (foo : Foo) =
  {
    X = foo.X * 2
  }
 

Затем я получаю сообщение об ошибке, подобное этому:

Типы.fs (3,6): ошибка FS0250: модуль и определение типа с именем ‘Foo’ встречаются в пространстве имен ‘App’ в двух частях этой сборки

Однако, если я помещу все в один файл, это сработает:

 // Everything.fs

namespace App

type Foo =
  {
    X : int
  }

module Foo =

  let doubleIt (foo : Foo) =
    {
      X = foo.X * 2
    }
 

Но мне это кажется одним и тем же, и я не хочу организовывать все в один большой файл.

  • Что здесь происходит?
  • Почему я не могу поместить модуль в другой файл?
  • Каков идиоматический способ организации этого кода?

 dotnet --version
3.1.403
 

Ответ №1:

[FS0250] — ‘ModuleSuffix’ должен быть добавлен явно

Итак, если вы хотите сохранить тип и модуль в отдельных файлах, затем украсьте имя модуля

 [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
 

Если вы поместите их в один и тот же файл, это будет сделано за вас.