F#中Item属性的类型

时间:2010-09-10 02:22:11

标签: syntax f# interface functional-programming

考虑界面:

type IVector = 
    abstract Item : int -> float

现在,让我们定义一下这个类:

type DenseVector(size : int) = 
    let mutable data = Array.zeroCreate size

    interface IVector with 
        member this.Item with get n = data.[n]

如何提供一种方法来改变密集向量的第n个条目?然后,将上述代码修改为:

会很高兴
type DenseVector(size : int) = 
    let mutable data = Array.zeroCreate size

    interface IVector with 
        member this.Item with get n = data.[n]
                          and set n value = data.[n] <- value

但是,由于Item界面中抽象方法IVector的签名,我收到以下错误:

未找到与此覆盖相对应的抽象属性。

那么ItemIVector的签名应该是什么?

2 个答案:

答案 0 :(得分:9)

type IVector =  
    abstract Item : int -> float with get, set

答案 1 :(得分:3)

您可以在不更改原始界面的情况下实现DenseVector,同时还提供如下设置器:

type IVector = 
    abstract Item: int -> float with get

type DenseVector(size : int) = 
    let data = Array.zeroCreate size
    interface IVector with 
        member this.Item with get i = data.[i]
    member this.Item 
        with get i = (this :> IVector).[i]
        and set i value = data.[i] <- value