views:

92

answers:

1

I was trying to use a fsi file to allow mutually recursive classes in separate files, but my fsi file did not compile. Below is a simple example which demonstrates the problem.

File program.fs:

module mod1
type first =
    |zero = 0

File File1.fs:

module mod2
type second =
    |zero2 = 0

Compiling with --sig:signature.fsi produces:

#light

module mod1
type first =
  |  zero  =  0

module mod2
type second =
  |  zero2  =  0

Which has an error on the line

type second

Which is

Error   1 Unexpected keyword 'type' in signature file. Expected ':', '=' or other token.
+1  A: 

You'd think that this is what signature files are for (like C++ header files), but it's not. At least, that's what I thought at first.

The only way to define mutually recursive types in F# is to put them in the same source file and use the and keyword:

module mod1_mod2
    type first =
      | zero = 0

    and second =
      | zero2 = 0
Tim Robinson
So why does the compiler emit a fsi file which does not compile then?
jpalmer
The main purpose of .fsi files is to define the signature (types and functions) exposed by a module; it's a concept carried over from OCaml. From a .NET interop point of view, marking your types and functions as public/private directly in the source code is more flexible.
Tim Robinson
Ah, misread your question. I'm not sure why the compiler emits an .fsi file that contains two modules.
Tim Robinson