f# - 为什么在 F# 中允许使用可变参数?它们什么时候必不可少?

标签 f#

来自 C#,试图让我了解这门语言。

据我了解,F# 的主要好处之一是您可以抛弃状态的概念,这应该(在许多情况下)使事情变得更加健壮。

如果是这种情况(如果不是,请纠正我),为什么允许我们用可变参数打破这个原则?对我来说,感觉就像它们不属于这种语言。我知道您不必使用它们,但它为您提供了偏离轨道并以 OOP 方式思考的工具。

任何人都可以提供一个例子来说明可变值在何处必不可少?

最佳答案

当前用于声明性(无状态)代码的编译器不是很聪明。这会导致大量内存分配和复制操作,这些操作相当昂贵。改变对象的某些属性允许重新使用处于新状态的对象,这要快得多。

想象你做一个游戏 10000 个单位以每秒 60 滴答的速度移动。您可以在 F# 中执行此操作,包括在单个 CPU 内核上与可变四叉树或八叉树发生冲突。

现在想象单位和四叉树是不可变的。编译器没有比每秒分配和构造 600000 个单元并每秒创建 60 个新树更好的主意。这不包括其他管理结构的任何变化。在具有复杂单元的实际用例中,这种解决方案会太慢。

F# 是一种多范式语言,使程序员能够编写函数式、面向对象的程序,并且在一定程度上可以编写命令式程序。目前,每个变体都有其有效用途。也许,在 future 的某个时候,更好的编译器将允许更好地优化声明式程序,但现在,当性能成为问题时,我们必须退回到命令式编程。

关于f# - 为什么在 F# 中允许使用可变参数?它们什么时候必不可少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29635231/

相关文章:

.net - 异步等待 n 件事发生

f# - 引用对象

f# - 如何将第三方 dll 引用添加到 F# 项目?

f# - “not equal to”的F#语法是什么?

asynchronous - F# Async.FromBeginEnd 不应该调用 End 函数?

.net - 使用 F# 和 Eto.Forms 捕获箭头键

linq - F# linq 查询和可为空的强制转换

F# PSeq.iter 似乎没有使用所有内核

f# - 如何从 F# 中的构造函数调用方法

inheritance - F# 添加多个调用基类构造函数的构造函数重载