我想实现堆数据结构,并希望将代码应用于任何支持比较的类型,即< => < => =操作。
如何在F#中执行此操作,因为它是静态类型的。
答案 0 :(得分:9)
确实如此,但你需要注释如下:
type Thing<'a when 'a:comparison> =
| Pair of ('a*'a)
with
member m.InOrder() =
match m with
| Pair (a,b) when a<=b -> true
| _ -> false
member m.Equal() =
match m with
| Pair (a,b) when a=b -> true
| _ -> false
Pair(1,2).InOrder() //true
Pair(3,2).InOrder() //false
Pair(42,42).Equal() //true
尝试按Thing<'a when 'a:comparison>
替换Thing<'a when 'a:equality>
以观看InOrder()
方法失败,而Equal()
仍然有效。将Thing<'a when 'a:comparison>
替换为Thing<'a>
,这两种方法都无效。
答案 1 :(得分:5)
有关相等和比较约束的具体情况的更多信息,请参阅
http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1621.entry
和
http://blogs.msdn.com/dsyme/archive/2009/11/08/equality-and-comparison-constraints-in-f-1-9-7.aspx
答案 2 :(得分:3)
是的,它确实支持泛型 - 以this为例。