2013-05-27 55 views
3

我需要一個數據類型,在F#中完全不透明,並且按照JS ===定義等式。 WebSharper手冊說,我應該重寫Equals,但我無法使其工作。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 

那麼,OpaqueType的正確定義是什麼?

當然,我可以使用obj並添加一個內聯函數,它將執行x === y,但我希望有更棒的東西。

回答

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庫是一致的(例如,在字典使用)。它們也通過虛擬方法與類型相關聯,因此內聯將無法正常工作。上面的代碼爲您提供了一個類似引用的相等語義的類型。

+2

哇,我不知道有一個'(===。)'操作符。我覺得WebSharper需要更多文檔... – kirelagin