F#是否支持模板或泛型?

时间:2010-01-07 12:11:23

标签: f#

我想实现堆数据结构,并希望将代码应用于任何支持比较的类型,即< => < => =操作。

如何在F#中执行此操作,因为它是静态类型的。

3 个答案:

答案 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)

答案 2 :(得分:3)

是的,它确实支持泛型 - 以this为例。