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

时间:2010-02-03 19:27:56

标签: c# f# functional-programming immutability

像Point,Size等值类型。

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

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

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

3 个答案:

答案 0 :(得分:10)

您可以使用来自F#的.Net BCL(基类库)中的类型。其中许多类型都是可变的,因此具有可变数据的所有相关成本和收益。

虽然人们可以选择重新设计和实现这些可变类中的每一个的不可变版本,但这往往是太多的工作。不变性可以是一个频谱,而不仅仅是全部或全部,所以你经常会有一些算法的核心部分和数据结构是不可变的,但在与各种.Net API交互时使用可变性,这使得它易于交谈Web服务,或绘制UI,或诸如此类的东西。

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

从'心态'的角度来看,我喜欢将其视为:F#鼓励可变的状态最小化。几乎每个重要的应用程序都必然会使用一些可变状态,但如果你保持核心数据结构和算法大多没有可变状态,那么你就可以获得代码核心部分的不变性。 F#使代码的核心更容易获得这种好处,同时仍然可以轻松地添加可变状态,无论是在作用域“口袋”中,还是在应用程序的边缘和通信边界周围。

答案 1 :(得分:1)

关于F#的好处是你不会被迫使一切都变成一成不变的。这意味着您可以首先在功能上编写代码,但如果您发现需要更多性能,也可以编写命令式代码。

所以回答你的问题:它处理得很好。

答案 2 :(得分:0)

您可以使用关键字mutable来使用可变数据结构em F#。 F#不是纯函数式语言。