gpt4 book ai didi

f# - 扩展现有类的索引器

转载 作者:行者123 更新时间:2023-12-01 04:51:41 26 4
gpt4 key购买 nike

假设我的类型 A 实现了索引器,例如A型是图书馆。现在我想扩展它的索引器,例如在这里我想将 float 添加到索引器中。

我编写了以下代码:

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# 中可以扩展索引器吗?谢谢!

最佳答案

当类型扩展在单独的程序集(或单独的模块)中定义时以及当它与类型定义位于同一模块中时,其行为会有所不同。

  • 当两者在同一个模块中时,F# 将它们编译成一个类并且 Item成为标准的重载索引器 - 在这种情况下,您的代码按预期工作(这就是您在此处实际编写代码的方式)。

  • 当它们位于单独的模块中时,F# 将索引器编译为扩展成员。在这种情况下,我收到了您描述的错误消息。

可以使用扩展成员(例如新方法)添加新的重载。据我所知,specificaton并不是说这对索引器不起作用,所以我认为这是一个错误(你能在 microsoftcom fsbugs 报告它吗em>?)

关于f# - 扩展现有类的索引器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com