2011-03-08 7 views
2

인덱서가 구현 된 유형 A가 있다고 가정합니다. 유형 A는 라이브러리입니다. 이제 그것의 인덱서를 확장하고 싶습니다. 여기서 플로터 번호를 인덱서에 추가하고 싶습니다.기존 클래스의 인덱서 확장

내가 다음 코드를 밖으로 일 :

type A(a:int array) = 
    member this.Item 
    with get(x) = a.[x] 
    and set(x) value = a.[x] <- value 

type A with 
    member m.Item with 
    get(x:float) = m.[x |> int] 
    and set(x:float) v = m.[x |> int] <- v 

을하지만이 작동하지 않는 것 같습니다 : 마지막 줄에 들어

let a = A([| 1;2;3 |]) 
a.[1] 
a.[1] <- 10 

a.[1.0] 

를, 내가 얻을 :

Script1.fsx(243,4): error FS0001: This expression was expected to have type 
    int  
but here has type 
    float  

가능 인덱서를 확장하고 F #에서? 감사!

답변

2

저는 FSI에서 이것을 시도해 보았습니다. 어떤 컴파일러를 사용하고 있습니까? 이 I는 FSI 공급 무엇인가

type A(a:int array) = 
    member this.Item 
    with get(x) = a.[x] 
    and set(x) value = a.[x] <- value 

type A with 
    member m.Item 
     with get(x:float) = m.[x |> int] 
     and set(x:float) v = m.[x |> int] <- v 

let a = A([| 1;2;3 |]) 
a.[1] <- 10 
printfn "%A" a.[1.2] 

이 지문 '10'

5

이 다르게 동작 유형 확장은 별도의 어셈블리 (또는 별도의 모듈)에 정의 될 때 동일한 일 때 모듈을 형식 정의로 사용합니다.

  • 가 동일한 모듈에있을 때, F 번호가 하나의 클래스로 컴파일하고 Item 표준 과부하 인덱서가된다 - 예상대로 코드가 작동,이 경우 (그리고 실제로 여기 쓴 방법이있다) .

  • 별도의 모듈에있을 때 F #은 확장 멤버로 인덱서를 컴파일합니다. 이 경우 설명 된 오류 메시지가 나타납니다.

확장 멤버를 사용하여 새 오버로드 (예 : 새 방법)를 추가 할 수 있습니다. 지금까지 내가 specificaton이가 인덱서 작동하지해야한다는 말을하지 않습니다 볼 수 있습니다, 그래서 그것을 버그라고 생각합니다 (당신은 마이크로 소프트닷컴fsbugs에보고 할 수 있습니까?)

+0

멋진 캐치, 토마스 배입니다 INT입니다! –

+0

고마워요 토마스! FSharp 버그 보고서에 이메일을 보냈습니다. –

0

오류 설명에 매우 명확하게 표시되어 있습니다. float를 지정하면 문제가 1.0이되므로 1로 바꾸면 문제가 없습니다.

1

1.0 일명,

1.0F이 float32입니다 떠 일부 언어에서

관련 문제