如何在 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
.
我一直在尝试用 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
.