c# - F# 如何处理 BCL 中数以千计的标准可变类型?

标签 c# f# functional-programming immutability

比如 Point、Size 等值类型。

我还听说 .NET 中的字符串并非真正不可变。 F# 是否使用这些或它们的替代不可变版本?

如果它使用标准的可变 BCL 类型,这不会损害 F# 在编译和运行时提供的整体不变性信任吗?

编辑:我想问的是,如果您有这些 BCL 类型的替代不可变版本,那么我就不必从头开始编写所有这些不同的 BCL 类型。或者这些类型(如 Point、Size 等)在使用 WinForms 或诸如此类的东西时仍然可变是期望的行为吗?

最佳答案

您可以在 F# 中使用 .Net BCL(基类库)中的类型。其中许多类型是可变的,因此伴随着可变数据的所有相关成本和 yield 。

虽然可以选择重新设计和实现每个可变类的不可变版本,但这通常工作量太大。不可变性可以是一个范围,而不仅仅是全有或全无,因此您通常会让算法和数据结构的一些核心位是不可变的,但是在与各种 .Net API 交互时使用可变性,使其易于交谈Web 服务,或绘制 UI,或诸如此类的东西。

也就是说,F# 运行时 (FSharp.Core.dll) 确实包含一些不可变的集合类,例如 list , SetMap (大致上,它们是 System.Collections.Generic 中的 List、HashSet 和 Dictionary 类的不可变对应物),因为拥有不可变集合通常很有用,例如用于多线程代码中的持久快照。

从“心态”的角度来看,我喜欢将其视为:F# 鼓励可变状态最小化。几乎每个重要的应用程序都必然会使用一些可变状态,但是如果您让您的核心数据结构和算法基本上不受可变状态的影响,那么您的代码的核心部分将获得不变性的好处。 F# 使您可以更轻松地在代码的核心获得此优势,同时仍然可以轻松添加可变状态,无论是在范围内的“口袋”中,还是在应用程序的边缘和通信边界周围。

关于c# - F# 如何处理 BCL 中数以千计的标准可变类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2194815/

相关文章:

c# - 监控现场麦克风输入

reflection - 这是一个 F# 引用错误吗?

f# - Array2D 在 GetHashCode() 中是否有错误?

functional-programming - `[< >]` 在 OCaml 中是什么意思?

javascript - 为什么我的 Ramda 管道功能不能与过滤器一起使用?

haskell - 将 Haskell 函数转换为 SML

c# - 为什么字符串非常昂贵

c# - Mef 导入实现在运行时指定的接口(interface)的所有类型

c# - 静态 DataContext 线程安全吗?

具有多个参数的 F# 向后管道运算符