高度可变域中的不可变函数对象

2024-01-08

我目前正在业余时间使用 Scala 学习函数式编程,并且我有一个闲置的新手问题。

在执行诸如计算 Haar 小波变换之类的操作时,即当对象表示的数据本身不发生变化时,我可以看到拥有不可变对象的优雅。

但我看到一个博客,其中有人在演示不变性时以一个小游戏为例。如果一个生物对象受到伤害,它不会改变其状态 - 它会返回一个具有新生命值和新的“对X的仇恨”标志的新生物对象。但如果我们要设计类似 MMORPG 的东西,《魔兽世界》会说。战场上有一百名玩家……可能有数千次攻击和抛光/减益法术效果以不同的方式影响他们。是否仍然可以用完全不可变的对象来设计系统?对我来说,似乎每次“滴答”都会有一大群新实例。为了获取当前有效的对象实例,所有客户端都必须不断地遍历某种中央“游戏世界”对象,或者?

函数式编程是否适合于此,或者这是“最好的工具做最好的工作,这里可能不是一成不变的”?


对我来说,似乎每次“滴答”都会有一大群新实例。

确实如此。我有一个 Haskell 应用程序,它读取市场数据源(在六个小时的交易日中大约有 500 万条消息,用于我们感兴趣的数据)并维护各种事物的“当前状态”,例如最近的买入价和卖出价以及工具的数量、我们的模型对市场的适应程度等等。在分析模式下针对记录的 feed 模拟该程序的运行并观察它的分配和 GC 接近 288 是相当可怕的运行的前 500 秒内占用 TB 内存(或接近机器 RAM 大小的 50,000 倍)。 (如果不进行分析,这个数字会高得多,因为分析不仅会减慢应用程序的速度,而且还会迫使所有应用程序都在一个核心上运行。)

但请记住,纯语言实现中的垃圾收集器针对此类行为进行了优化。我对应用程序的整体速度非常满意,并且我认为它的要求相当高,因为我们必须每秒从市场源中解析数百条消息,进行一些相当广泛的计算来构建我们的模型,并使用它模型生成订单以尽快到达交易所。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高度可变域中的不可变函数对象 的相关文章

  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • Scala 函数定义参数列表中不同的括号样式

    Scala 中以下两个函数定义有什么区别 1 def sum f Int gt Int a Int b Int Int code 2 def sum f Int gt Int a Int b Int Int code SBT 的控制台 RE
  • 忽略 Racket 中的多个返回值

    在 Racket 中 可以通过执行以下操作从函数返回多个值 define foo values 1 2 3 然后我们可以通过这样做来绑定它们 define values one two three foo Now one一定会1 two t
  • 某些数据结构是否比其他数据结构更适合函数式编程?

    In 现实世界哈斯克尔 http book realworldhaskell org 有一个标题为 没有数组或哈希表的生活 的部分 其中作者建议在函数式编程中首选列表和树 而在命令式程序中可能会使用数组或哈希表 这是有道理的 因为在创建新列
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 如何在 Octave 中使用具有自定义功能的地图?

    假设我有一个集合A A 0 6 100 我有一个功能fib n function retval fib n g1 1 5 5 2 g2 1 5 5 2 retval 1 5 5 g1 n g2 n endfunction 我希望能够申请fi
  • 返回带有参数的函数的函数

    创建一个应返回包含原始函数参数的函数时 我应该如何处理 例如考虑这个函数 a lt function value function x x value 我希望它返回我在结果函数的参数中指定的值 如下所示 b lt a 3 gt b gt f
  • Java泛型 - 实现像map这样的高阶函数

    我决定用 Java 编写一些常见的高阶函数 map filter reduce 等 这些函数通过泛型实现类型安全 但我在一个特定函数中遇到通配符匹配问题 为了完整起见 函子接口是这样的 The interface containing th
  • Haskell 有 takeUntil 函数吗?

    目前我正在使用 takeWhile x gt x 1 x 89 l 从列表中获取最多为 1 或 89 的元素 但是 结果不包括这些标记值 Haskell 是否有一个标准函数可以提供这种变化takeWhile结果中包含哨兵 到目前为止 我对胡
  • 带参数的 Python 列表过滤

    python中有没有一种方法可以在列表上调用过滤器 其中过滤函数在调用期间绑定了许多参数 例如有没有办法做这样的事情 gt gt def foo a b c return a lt b and b lt c gt gt myList 1 2
  • RxJS 比命令式更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对函数式编程和函数式反应式编程比较陌生 我读了很多遍函数式反应式编程的强大力量 好的 可读 避免副作用等 但是 我不知道如何以功能
  • C++0x (C++11) 作为函数式语言?

    我想知道 C 0x C 11 带有 lambda 和完美转发 是否是一种函数式语言 的超集 函数式语言有什么特性是 C 所没有的吗 函数式编程范式将计算建模为集合之间的关系 因此本质上是声明性的 然而 在实践中 我们通常认为函数是命令式的
  • 如何使用 Immutable.js 从 javascript 原始对象创建记录映射?

    我是 immutable js 的新手 我想更好地了解如何使用从原始 JS 对象开始的记录 With Immutable fromJS 我可以创建一个传递原始对象的地图 例如 var images 1 id 1 urls medium 1
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 并行应用程序的可变与不可变[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我正在编写的应用程序中 我需要编写大量基本类型 这些类型很可能是不可变的 但我想知道并行应用程序中可变类型与不可变类型的比较如何 您可以对可变
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 将名称绑定到值与将值分配给变量

    阅读 Bartosz Milewski 的文章完整的 https www fpcomplete com school starting with haskell basics of haskell 3 pure functions lazi

随机推荐