Как избежать ошибки, когда модуль и определение типа встречаются в двух частях сборки

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

// Types.fs

namespace App

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

module App.Foo

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

Тогда я получаю такую ​​ошибку:

Types.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

f#
person sdgfsdh    schedule 20.11.2020    source источник


Ответы (1)


[FS0250] - "ModuleSuffix" необходимо добавить явно

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

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]

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

person Jim Foye    schedule 21.11.2020