2010-04-21 52 views
5

在F#中,相等運算符(=)通常是擴展的,而不是內涵。那很棒!不幸的是,在我看來,F#並沒有使用指針相等來縮短這些擴展比較。F#中的快捷等式檢查?

例如,下面的代碼:

 
type Z = MT | NMT of Z ref 

// create a Z: 
let a = ref MT 
// make it point to itself: 
a := NMT a 

// check to see whether it's equal to itself: 
printf "a = a: %A\n" (a = a) 

...給了我一個大胖子分段錯誤[*],儘管事實是 'A' 和 'A' 都計算出相同的參考。這並不好。其他函數式語言(如PLT Scheme)通過保守地使用指針比較得到了正確的結果,當它可以使用指針比較來確定時返回「真」。因此:我會接受F#的平等運算符不使用捷徑的事實;有沒有辦法執行內涵(基於指針的)相等性檢查? (==)運算符沒有在我的類型中定義,如果有人能夠告訴我它有某種方式可用,我會喜歡它。

或者告訴我,我錯了,我的情況分析:我很喜歡這個,太...

[*]這很可能是Windows上的堆棧溢出;有一些關於莫諾我不喜歡...

回答

7

有兩個選項,我知道。標準的.NET方法將使用System.Object.ReferenceEquals。 F#中稍微好一點的方法可能是使用LanguagePrimitives.PhysicalEquality,它基本上是相同的,但只適用於引用類型(這可能對您的目的而言是正確的),並且要求兩個參數具有相同的靜態類型。如果你想要更好的語法,你也可以根據這些函數定義一個你自己選擇的自定義運算符。另外,在.NET上,當我運行你的代碼時,我得到一個無限循環,但不是一個堆棧溢出,可能是由於尾部調用優化。

+0

謝謝!順便說一句:是的,這實際上是在mono/osx上轉儲核心。也許tail-calling在我使用的mono/fsharp的特定組合中進行相等性檢查時沒有正確執行。 – 2010-04-21 21:09:17

相關問題