首页 文章

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

提问于
浏览
2

像Point,Size等值类型 .

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

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

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

3 回答

  • 0

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

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

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

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

  • 1

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

    所以回答你的问题:它处理它们就好了 .

  • 10

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

相关问题