gpt4 book ai didi

F# 不可变类互操作

转载 作者:行者123 更新时间:2023-12-04 16:36:40 25 4
gpt4 key购买 nike

F# 不可变类型如何与 C# 接口(interface)。我刚刚开始学习 F#,我想将它与我拥有的一些 C# 代码混合,但我希望我的 F# 类是不可变的。

假设我们正在 F# 中创建一个 Vector 类。 Vector.X 和 Vector.Y 应该是可重新分配的,但只返回一个新的 Vector 类。在 C# 中,这需要大量的工作来使 .WithX(float x) 克隆现有对象并返回一个新对象。有没有一种简单的方法可以在 F# 中做到这一点?

我已经搜索了一段时间,但似乎找不到任何关于此的文档。所以任何帮助都会很棒。

最后,如果我将这个类导入 C#,它的界面会是什么样子? F# 代码会限制我做一些愚蠢的事情,比如 Vector.X = 10 ?

最佳答案

无论是 C# 还是 F#,这看起来都相似。

你说“在 C# 中它需要跑腿”,但我认为 cmon

Vector WithX(float x) { return new Vector(x, this.Y); }

这样对吗?

在 C# 和 F# 中,为了防止分配给 X 属性,您编写了一个带有“getter”但没有“setter”的属性。

我认为您正在使所有这些变得比现在更难,或者我可能误解了您的要求。

编辑

对于(我认为很少见)有 20 个字段并且您可能只想更改其中的一小部分任意子集的情况,我发现了一个可爱的技巧,可以很好地一起使用 F# 和 C# 可选参数。

F# 代码:
namespace global

open System.Runtime.InteropServices

type Util =
static member Some<'T>(x:'T) = Some x

type MyClass(x:int, y:int, z:string) =
new (toClone:MyClass,
[<Optional>] ?x,
[<Optional>] ?y,
[<Optional>] ?z) =
MyClass(defaultArg x toClone.X,
defaultArg y toClone.Y,
defaultArg z toClone.Z)
member this.X = x
member this.Y = y
member this.Z = z

F# 客户端代码:
let a = new MyClass(3,4,"five")
let b = new MyClass(a, y=44) // clone a but change y

C#客户端代码:
var m = new MyClass(3, 4, "five");
var m2 = new MyClass(m, y:Util.Some(44)); // clone m but change y

也就是说,可选参数是一种很好的方法,虽然 C# 可选参数有一些限制,但您可以按照上面的建议以与 C# 兼容的方式公开 F# 可选参数。

关于F# 不可变类互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com