F#在类上实现list []运算符?

时间:2010-04-22 01:10:40

标签: f# operator-overloading

我在F#中有一个自定义类,我想实现[]列表运算符,使

let myClass = new myClassObj()
let someVal  = myClass.[2]

我似乎无法在网上找到这个 - 我可能不知道正确的搜索字词...提前感谢

3 个答案:

答案 0 :(得分:5)

您只需要实现Item索引属性。例如。

type MyClass() =
  member x.Item with get(i:int) = (* some logic involving i here *)

答案 1 :(得分:5)

如果您从F# language reference开始,并转到members,其中一个主题是indexed properties

答案 2 :(得分:5)

值得补充的是,F#还支持切片语法(在索引的本地 MSDN页面上未提及)。这意味着您不仅可以索引m.[0]等单个元素,还可以索引m.[0..5]或无限范围m.[5..]等切片。这对于各种数值数据类型(例如矩阵)非常有用。

要支持此功能,类型必须定义GetSlice方法。以下示例使用2D场景演示了这一点:

type Foo() = 
  member x.GetSlice(start1, finish1, start2, finish2) =
    let s1, f1 = defaultArg start1 0, defaultArg finish1 0
    let s2, f2 = defaultArg start2 0, defaultArg finish2 0
    sprintf "%A, %A -> %A, %A" s1 s2 f1 f2

> let f = new Foo()    
  f.[1.., 1..10];;
val it : string = "1, 1 -> 0, 10"

参数的类型为int option,此处我们使用defaultArg指定0作为默认值。