Fsharp: F# allows same module names if in different namespaces, but not same file names even if in different folders

Created on 21 Jun 2017  路  8Comments  路  Source: dotnet/fsharp

When having module name clashes, namespacing is important.

For example, you have two modules named "Foo" in the same F# assembly. If you place them under namespaces Bar.Foo and Baz.Foo, the compiler is happy.

However, normally developers try to mimic directory-file name structures to map exactly with namespace-type ones. In this case, the F# compiler is not helping, because placing two Foo.fs for the same project, even if in different directories Bar\Foo.fs and Baz\Foo.fs, it gives this error:

error FS0239: An implementation of the file or module 'Foo' has already been given

Repro steps

  1. Have an F# project with 2 modules Foo: one namespaced Bar.Foo (BarFoo.fs) and the other Baz.Foo (BazFoo.fs).
  2. F# compiler compiles the project succesfully.
  3. Move BarFoo.fs to a subfolder Bar and rename the file to Foo.fs.
  4. Move BazFoo.fs to a subfolder Baz and rename the file to Foo.fs.
  5. Try to compile again.

Expected behavior

F# compiler should succeed.

Actual behavior

error FS0239: An implementation of the file or module 'Foo' has already been given

Known workarounds

Rename files to redundant names such as BarFoo.fs and BazFoo.fs (even if they're already in Bar and Baz directories).

Related information

Provide any related information

  • Windows8
  • .NET 4.5.1
  • VisualStudio 2017
  • F# 4.1
Resolution-Fixed

Most helpful comment

This came up again.
Using VS Community 2017 - 15.6.2
Visual F# Tools 10.1 for F# 4.1

The error seemed to go away after closing the file, and reopening it, making a change, saving, undoing that change, and saving.

The error re-appears if I save the abstract superclass

So, I have:

base/
  RestClient.fs
exchanges/
  exchange-name/
    RestClient.fs

and the exchange-name/RestClient is what gives the error: An implementation of the file or module 'RestClient__2' has already been given.
But the base/RestClient.fs only defines type public IRestClient and type publicAbstractRestClient`

All 8 comments

Didn't we fix this already?

@forki I see the fix for that was merged in the 3rd of April. Did that change make it to the F#4.1 release?

@knocte It will be in the 15.3 update, and is in the process of being integrated into the Mono 5.x series (which already contain F# 4.1, but not this fix)

@knocte It will be in the 15.3 update

Thanks for the info, but what is 15.3 exactly? Is it a minor version number? F# 4.1.15.3? Where is that version number reflected?

15.3 --> VS 2017 Update 3.

VS 2017 is the 15th version of VS and how we refer to it internally. That leaks out into GitHub sometimes out of habit.

ok thanks very much @cartermp

This came up again.
Using VS Community 2017 - 15.6.2
Visual F# Tools 10.1 for F# 4.1

The error seemed to go away after closing the file, and reopening it, making a change, saving, undoing that change, and saving.

The error re-appears if I save the abstract superclass

So, I have:

base/
  RestClient.fs
exchanges/
  exchange-name/
    RestClient.fs

and the exchange-name/RestClient is what gives the error: An implementation of the file or module 'RestClient__2' has already been given.
But the base/RestClient.fs only defines type public IRestClient and type publicAbstractRestClient`

Was this page helpful?
0 / 5 - 0 ratings