如何在 F# 中拥有指针成员

How to have pointer members in F#

我一直在尝试用 F# 编写一些我在 C++ 中构想得很好的东西:一个 class 作为成员的一个指向相同类型对象的指针列表。 因为我没有成功,所以我只发布了我的嵌合尝试,其中包含指针列表(这显然不是正确的 F# 并且无法编译)。

正如下面程式化的嵌合愿望所示,我们的想法是创建一堆 Fred,然后根据需要构建分配它们的 myListOfPointers,然后再计算一个特定 Fred 的 f()。我已经添加了一个大数据成员来说明不应复制 Fred,但在我的目标应用程序中调用 f() 会更改 Fred 的状态,因此似乎更重要的是每个 Fred 不应存储副本在其他人中,它的 f 需要计算,但只需要 "reference or pointer" 计算。如果这需要完全重新设计,请简要说明要遵循的路径。

type Fred(bigData:float[]) = 
{
    let data_ = bigData
    let mutable l = [] // list of "pointers to Fred", if there were such a thing
    member s.myListOfPointers with set(z) = l <- z
    member s.f() =
        match l with
            | [] -> Array.sum data_
            | _ ->  l |> List.map (fun p -> (*p).f()) //This dereferencing * operator is C++ language for what I would like to do.
                |> List.map (fun x ->  x * x) |> List.sum  
}

谢谢!

通过一些小的调整,您的代码可以运行:

type Fred(bigData:float[]) = 
    let data_ = bigData
    let mutable l = [] // list of "pointers to Fred", if there were such a thing
    member s.myListOfPointers with set(z) = l <- z
    member s.f() =
        match l with
            | [] -> Array.sum data_
            | _ ->  l |> List.map (fun (p: Fred) -> p.f())
                      |> List.map (fun x ->  x * x) |> List.sum  

值得注意的是在调用 f() 之前需要对 p 进行类型注释。这是因为 l 的类型此时未知。

在 f# 中不能有指向 Fred 的指针。相反,您只会有一个 Fred 列表。列表的实际内容实际上是指向 Freds 的指针,但语言并没有那样概念化它们。相反,它们是 .NET 对象引用。如果您不熟悉这些概念,请阅读引用类型与值类型,也称为 类(引用类型)和结构(值类型):

Classes and Structs (C# Programming Guide)

所以你的列表变成了 Fred list 并且 lambda 变量 p 没有被取消引用;它不是指向 Fred 的指针,它的类型只是 Fred。因此,您可以将其重命名为 f.