2010-04-22 82 views
3

我在F#的自定義類,我想要實現的[]列表操作,使得F#在類上實現list []運算符?

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

我似乎無法找到該網頁上 - 我可能不知道正確的術語搜索...提前致謝

回答

5

你只需要實現一個Item索引屬性。例如。

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

非常感謝 - 我會去哪裏找到更多像這樣的事情(在[]上搜索網頁或索引或列表中沒有吸引人的信息] – akaphenom 2010-04-22 01:28:59

+0

@ak指的是F#的源代碼。 matrix.fs中的一個很好的矩陣實現。 – 2010-04-22 01:40:26

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。