Implement a C# Interface in F#

f#

Solution

The `interface` block should only contain functions that are part of the interface, but you can place other functions before the block:

type GermanShepherd() = 
    member this.Eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"

If you do not need a public member, then you can go with a private let-bound function:

type GermanShepherd() = 
    let eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"

Also note that F# currently only allows explicit interface implementations, which means that you can treat `GermanShepherd` as `IDog`, but you won't see `IDog` members explicitly:

let g = GermanShepherd()
g.Eat()            // OK
g.Bark()           // Error, interface members are implemented explicitly
let d = g :> IDog  // To 'Bark', we need to get 'IDog' first
d.Bark()           // OK

One workaround for this is to add the `Bark` method explicitly as a separate member outside of the `interface` block. Although there is F# language issue for this too!

Problem

I have the following interface in C# ``` public interface IDog { String Bark(); } ``` I want to create an implementation in F#. I had no problem with this: ``` type GermanShepherd() = interface IDog with member this.Bark() = "Woof" ``` but when I added a supporting function that is not part of the interface like this: ``` type GermanShepherd() = interface IDog with member this.Bark() = "Woof" member this.Eat() = "Yummy" ``` the compiler complained: ``` Error 1 No abstract or interface member was found that corresponds to this override Error 2 This value is not a function and cannot be applied* ``` Is there a way of implementing private/internal functions with a type that implements an interface without those functions being part of the interface? I can't change the interface in my 'real' application b/c there are other projects that implement the interface. None of the examples on MSDN that I found have this particular scenario.

Original source