F# WebSharper:具有相等性检查的不透明类型`===`

F# WebSharper:具有相等性检查的不透明类型`===`,f#,websharper,F#,Websharper,我需要一个在F#中完全不透明的数据类型,并且根据JS==定义相等。WebSharper手册说我应该覆盖等于,但我不能让它工作 let x : OpaqueType = X<_> let f (y : OpaqueType) = if x = y then // this line should be translated to `if (x === y)` 42 else 10 设x:OpaqueType=x 设f(y:Opaque

我需要一个在F#中完全不透明的数据类型,并且根据JS
==
定义相等。WebSharper手册说我应该覆盖
等于
,但我不能让它工作

let x : OpaqueType = X<_>

let f (y : OpaqueType) =
    if x = y then // this line should be translated to `if (x === y)`
        42
    else
        10
设x:OpaqueType=x
设f(y:OpaqueType)=
如果x=y,那么//这一行应该翻译为“如果(x==y)”`
42
其他的
10
那么,
OpaqueType
的正确定义是什么


当然,我可以使用
obj
并添加一个内联函数,该函数将执行
x==y
,但我希望有更棒的功能。

我会选择这样的功能:

module Test =
    open IntelliFactory.WebSharper

    [<JavaScript>]
    let Counter = ref 0

    [<Sealed>]
    [<JavaScript>]
    type T() =

        let hash =
            incr Counter
            Counter.Value

        [<JavaScript>]
        override this.GetHashCode() =
            hash

        [<JavaScript>]
        override this.Equals(other: obj) =
            other ===. this


    [<JavaScript>]
    let Main () =
        let a = T()
        let b = T()
        JavaScript.Log(a, b, a = b, a = a, hash a, hash b)
模块测试=
打开IntelliFactory.WebSharper
[]
设计数器=ref 0
[]
[]
类型T()=
让我们散列=
递增计数器
计数器值
[]
重写这个。GetHashCode()=
搞砸
[]
覆盖此。等于(其他:obj)=
其他===。这
[]
让Main()=
设a=T()
设b=T()
Log(a,b,a=b,a=a,散列a,散列b)

NET库希望相等和哈希保持一致(例如,在字典中使用)。它们还通过虚拟方法与类型关联,因此内联将无法正常工作。上面的代码为您提供了一个具有类似于等式语义的引用的类型

哇,我不知道有一个
(==)
接线员。我觉得WebSharper需要更多的文档…