WebSharper: непрозрачный тип с проверкой равенства для `===`

Мне нужен тип данных, который будет полностью непрозрачным в 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, но мне бы хотелось чего-то покруче.


person kirelagin    schedule 27.05.2013    source источник


Ответы (1)


Я бы пошел на что-то вроде этого:

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 (например, для использования в словаре). Они также связаны с типами через виртуальные методы, поэтому встраивание будет работать некорректно. Приведенный выше код дает вам тип с семантикой равенства, подобной ссылке.

person t0yv0    schedule 27.05.2013
comment
Ого, я не знал, что есть оператор (===.). Я чувствую, что WebSharper нужно больше документации… - person kirelagin; 27.05.2013