如何在F#中隐藏方法?

Tho*_*enz 5 api f#

我目前正在F#中实现一个Spec框架,我希望在我的should类型上隐藏Equals,GetHashCode等方法,这样API就不会混杂在一起.

我知道在C#中它是通过使类实现这样的接口来完成的:

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();
}
Run Code Online (Sandbox Code Playgroud)

我尝试在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
Run Code Online (Sandbox Code Playgroud)

在我的类型中实现它:

        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() 
Run Code Online (Sandbox Code Playgroud)

但没有成功.

我也试图覆盖我的类型中的方法并以这种方式添加属性,但这也没有做到.

所以问题仍然存在,我该如何清理我的API?

编辑:

感谢帮助(见下文),我能够解决我的问题.

总之,.Equals.GetHashCode可以通过被隐藏 [<NoEquality>] [<NoComparison>],但也将改变语义.

通过EditorBrowsable属性隐藏不起作用.

拥有一个干净的API并且仍能够重载方法的唯一方法是使这些方法成员保持静态.

通过浏览我的项目FSharpSpec可以找到生成的类.

有问题的类型可以在这里找到.

感谢所有帮助我解决这个问题的人.

干杯......

Tom*_*cek 5

或者,您可以使用包含在模块中的函数使用替代样式来设计库。这是在 F# 中编写函数代码的常用方法,然后您就不需要隐藏任何标准的 .NET 方法。为了完成'kvb'给出的例子,这里是一个面向对象解决方案的例子:

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
Run Code Online (Sandbox Code Playgroud)

编写代码的功能方式可能如下所示:

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
Run Code Online (Sandbox Code Playgroud)

如果您键入MyNum.,F# IntelliSense 将显示模块中定义的函数,因此在这种情况下您不会看到任何干扰。


Bri*_*ian 5

重复我的回答

http://cs.hubfs.net/forums/thread/13317.aspx

在F#中,您可以通过使用NoEquality和NoComparison属性注释类型来禁止Equals和GetHashCode(并从intellisense中删除它们),如下所示.用户定义的方法也可以通过Obsolete属性或带有IsHidden = true的CompilerMessage属性从智能感知列表中隐藏.无法从F#intellisense隐藏System.Object方法GetType和ToString.

[<NoEquality; NoComparison>]
type Foo() =
    member x.Bar() = ()
    member x.Qux() = ()
    [<System.Obsolete>]
    member x.HideMe() = ()
    [<CompilerMessage("A warning message",99999,IsError=false,IsHidden=true)>]
    member x.WarnMe() = ()

let foo = new Foo()
foo.  // see intellisense here
Run Code Online (Sandbox Code Playgroud)