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

Pointers 如何在F中拥有指针成员#,pointers,f#,Pointers,F#,我一直在尝试用F#写一些我在C++中构思得很好的东西:一个类的成员有一个指向相同类型对象的指针列表。 因为我没有成功,所以我只发布了我的奇幻尝试,包括了指针列表(这显然是不正确的F#,并且没有编译) 正如下面样式化的嵌合体愿望所示,我们的想法是创建一组Fred,然后在计算一个特定Fred的f()之前,根据需要构建并分配它们的MyListofPointer。我添加了一个大型数据成员,以说明不应复制Fred,但在我的目标应用程序中,调用f()会更改Fred的状态,因此更重要的是,每个Fred不应存储

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

正如下面样式化的嵌合体愿望所示,我们的想法是创建一组Fred,然后在计算一个特定Fred的f()之前,根据需要构建并分配它们的MyListofPointer。我添加了一个大型数据成员,以说明不应复制Fred,但在我的目标应用程序中,调用f()会更改Fred的状态,因此更重要的是,每个Fred不应存储其f需要计算的其他Fred的副本,而应仅存储指向这些Fred的“引用或指针”。如果这需要完全重新设计,请简要说明要遵循的路径

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  
}
键入Fred(bigData:float[])=
{
让数据=大数据
让可变的l=[]//如果有这样一个东西,“指向Fred的指针”列表
具有集合(z)=l Array.sum数据的成员s.myListOfPointers_
{>L>List.Max(Fund P->(*P).f-())/这个DeReField**是C++语言,用于我想做的事情。
|>List.map(乐趣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  
键入Fred(bigData:float[])=
让数据=大数据
让可变的l=[]//如果有这样一个东西,“指向Fred的指针”列表
具有集合(z)=l Array.sum数据的成员s.myListOfPointers_
|->l |>List.map(fun(p:Fred)->p.f())
|>List.map(乐趣x->x*x)|>List.sum

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

在f#中不能有指向Fred的指针。相反,你只需要一份弗雷德的名单。列表的实际内容实际上是指向Freds的指针,但是语言并没有这样概念化它们。相反,它们是.NET对象引用。如果您不熟悉这些概念,请仔细阅读引用类型与值类型,即类(引用类型)和结构(值类型):


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

当然,您也可以将列表声明为
let mutable l:Fred list=[]
;在这种情况下,不需要对lambda参数进行注释。我认为,在let绑定中,将类型注释放在类型的顶部,比将注释埋在lambda中提供了更好的类型概述。谢谢,Daniel和phoog。那么你是说如果我声明两个fred,fred1,fred2,并调用fred1.myListOfPointers@imateapot,那么所有引用类型变量都持有对对象的引用(当然也可以是null)。对象本身存在于垃圾收集堆上。你不能用F#进入它的内脏;你可以使用C语言中的“不安全”代码,并用C++,但是首先你必须对对象进行PIN,这样垃圾回收器就不会从你的身上移开它。谢谢大家,F类型是引用类型的事实说明了一切!