如何在F#中使用指针成员

时间:2015-02-24 22:19:35

标签: pointers f#

我试图在F#中编写一些我在C ++中很好地构思的东西:一个类,它具有指向相同类型对象的指针列表。 因为我还没有成功,我只发布了我的嵌合尝试,包含了指针列表(显然这是不正确的F#并且没有编译)。

正如下面的程式化嵌合体愿望所示,想法是创建一堆Freds,然后在计算一个特定Fred的f()之前根据需要构建它们的myListOfPointers。我已经添加了一个大数据成员来说明Freds不应该被复制,但在我的目标应用程序中调用f()会改变Fred的状态,所以每个Fred应该更重要不存储其f需要计算的其他人的副本,但只存储"引用或指针"对那些。如果需要完全重新设计,请简洁地说明要遵循的路径。

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  
}

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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  

值得注意的是,在调用p之前需要f()上的类型注释。这是因为此时不知道l的类型。

答案 1 :(得分:1)

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

Classes and Structs (C# Programming Guide)

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