How can I hide methods in F#?

api, f#

Solution

Alternatively, you could design the library using an alternative style using functions enclosed in a module. This is the usual way for writing functional code in F# and then you won't need to hide any standard .NET methods. To complete the example given by 'kvb', here is an example of object-oriented solution:

type MyNum(n:int) =
  member x.Add(m) = MyNum(n+m)
  member x.Mul(m) = MyNum(n*m)

let n = new MyNum(1)
n.Add(2).Mul(10) // 'ToString' shows in the IntelliSense

The functional way of writing the code might look like this:

type Num = Num of int
module MyNum =
  let create n = Num n
  let add m (Num n) = Num (m + n)
  let mul m (Num n) = Num (m * n)

MyNum.create 1 |> MyNum.add 2 |> MyNum.mul 10

If you type `MyNum.`, the F# IntelliSense will show the functions defined in the module, so you won't see any noise in this case.

Problem

I am currently implementing a Spec framework in F# and I want to hide the Equals, GetHashCode etc. methods on my `should` type, so that the API is not cluttered with these. I know in C# it is done by making the class implement an interface like this: ``` using System; using System.ComponentModel; public interface IFluentInterface { [EditorBrowsable(EditorBrowsableState.Never)] bool Equals(object other); [EditorBrowsable(EditorBrowsableState.Never)] string ToString(); [EditorBrowsable(EditorBrowsableState.Never)] int GetHashCode(); [EditorBrowsable(EditorBrowsableState.Never)] Type GetType(); } ``` I tried doing the same in F#: ``` type IFluentInterface = interface [<EditorBrowsable(EditorBrowsableState.Never)>] abstract Equals : (obj) -> bool [<EditorBrowsable(EditorBrowsableState.Never)>] abstract ToString: unit -> string [<EditorBrowsable(EditorBrowsableState.Never)>] abstract GetHashCode: unit -> int [<EditorBrowsable(EditorBrowsableState.Never)>] abstract GetType : unit -> Type end ``` Implemented it in my type: ``` interface IFluentInterface with member x.Equals(other) = x.Equals(other) member x.ToString() = x.ToString() member x.GetHashCode() = x.GetHashCode() member x.GetType() = x.GetType() ``` but without success. I also tried to override the methods in my type and adding the attribute that way, but that didn't do the trick either. So the question remains, how can I clean up my API ? Edit: Thanks to the help (see below) I was able to solve my problem. In summary, `.Equals` and `.GetHashCode` can be hidden via `[<NoEquality>]` `[<NoComparison>]` but that will also change the semantics. The hiding via EditorBrowsable attributes does not work. The only way to have a clean API and still be able to overload methods is to make these method members static. The resulting class can be found by browsing inside my project FSharpSpec. The type in question can be found here. Thanks to everyone who helped me solve this problem. Cheers ...

Original source

Related problems