3

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

let x : OpaqueType = X<_>

let f (y : OpaqueType) =
    if x = y then // this line should be translated to `if (x === y)`
        42
    else
        10

那么,什么是正确的定义OpaqueType

当然,我可以使用obj并添加一个内联函数,x === y但我想要更棒的东西。

4

1 回答 1

2

我会去做这样的事情:

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)

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

于 2013-05-27T19:28:59.367 回答