我试图在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
}
谢谢!
答案 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
。