jz87
jz87

Reputation: 9627

Alternatives to functors in F#

I would like to write the following:

module A =
  type Token 
  let foo Token = 

module B =
  type Token 
  let foo Token = 

let run (m : module) =
  m.B
  |> m.foo

basically a function that's generic in the module. Is there a way to do this in F#?

Upvotes: 2

Views: 514

Answers (1)

Tomas Petricek
Tomas Petricek

Reputation: 243061

As kvb pointed out in a comment, it is hard to give an answer without a realistic example, because the best approach will depend on what you're actually trying to do.

In this trivial example, I would probably use F# interface to represent Token and add Foo as a member. Assuming that Foo returns an int, you can write the definition like this:

type Token = 
  abstract Foo : unit -> int

Then you can implement different tokens either using classes (which is quite heavyweight) or using object expressions. For example:

let tok = { new Token with
              member x.Foo () = 42 }

The code that corresponds to your run function is just a call of the Foo member: tok.Foo()

Upvotes: 3

Related Questions