gpt4 book ai didi

f# - 使用更新的片段定义大型不可变类型的正确方法?

转载 作者:行者123 更新时间:2023-12-04 19:21:14 24 4
gpt4 key购买 nike

我正在用 F# 设计一个游戏对象。在 C++ 中,我会创建类来表示图形方面、物理等,每个类都具有动态值,然后将这些类的实例添加到游戏对象中。我可以在具有可变类型的 F# 中使用相同的设计,但我试图保持一切不可变。因此,如果我使用相同的设计,我将在每帧重新创建数千个大型对象,并且可能将所有 CPU 时间都花在分配上。

有什么方法可以定义一种类型,我可以在其中链接到另一个对象的值并提供新的值,以减少分配?

例如,要更改框的颜色,我想将旧框的内存与新图形一起使用,并将旧图形的内存与新颜色一起使用:

let box = ...
...

let changedBox = {box with
graphics = { box.graphics with colour = blue} }

最佳答案

对,就是这样。假设“大对象”实际上是许多较小对象的引用图,那么典型的“不可变更新”只会创建一两个新的小对象,并为其余对象引用相同的旧对象。

例如,如果 Person 有 Name 和 Address,Address 有 Street、City、State 和 Zip,我需要更新一个人的 zip,那么我只需要为生成树从根到 zip 。见例如this blog 中的红黑颜色图.在 person 示例中,Name、Street、City 和 State 对象将被重用,但 ZIp 将是一个新对象,Address 将是一个新对象(因为它包含新的 Zip),而 Person 将是一个新对象(因为它包含新地址)。是否有意义?

关于f# - 使用更新的片段定义大型不可变类型的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com