gpt4 book ai didi

architecture - 将 F# 集成到现有的 .Net 应用程序中

转载 作者:行者123 更新时间:2023-12-01 09:38:50 24 4
gpt4 key购买 nike

我有兴趣将 F# 在并行性领域的优势应用到现有的 .Net 应用程序中。那就是——我想考虑一个 F# 组件,它只处理我的应用程序的并发消息传递,同时保留我现有的大部分 .Net 项目。现有应用程序将调用 F# 组件。

1) 这种架构是否可取?2) 如果是这样,是否有任何示例可以展示此设计的最佳实践方法?

谢谢,

约翰

最佳答案

1) Is this architecture advisable?

这当然不是一个坏方法:)

我主要担心的是它会如何影响团队的其他成员——他们是否需要学习一门新语言来添加新功能或调试问题?如果您团队的其他成员不习惯使用它,您可能需要考虑在 C# 中寻找或构建自己的消息传递库。

2) If so, are there any examples out there that demonstrate a best practices approach to this design?

我一直喜欢在我的项目中混合使用 F# 和 C#。以我自己的经验,利用 F# 中的 C# dll 比其他方式容易得多。我们喜欢在 F# 中使用的大多数构造在 C# 中看起来很有趣且不直观。只是为了好玩,看看下面的代码是如何在 Reflector 中呈现的:

let f x y z = x(y z)
let (|A|B|C|) x =
match x with
| 1 -> A
| 2 -> B
| x -> C x
type whatever = X | Y | Z of int

柯里化(Currying)函数呈现为 FSharpFunc ,事件模式有一个有趣的名称和返回类型,联合有一组非常奇怪的成员,等等。它们在 C# 中看起来很奇怪,所以你很可能希望为你期望的任何模块公开一个具有更好 C# 签名的外观公开消费。例如:

module CSharpFacade =
let f(x : System.Func<_, _>, y : System.Func<_, _>, z) = f (fun param -> x.Invoke(param)) (fun param -> y.Invoke(param)) z

[<AbstractClass>]
type Whatever() =
inherit obj()
abstract member Map : unit -> whatever
type X() =
inherit Whatever()
override this.Map() = whatever.X
type Y() =
inherit Whatever()
override this.Map() = whatever.Y
type Z(value : int) =
inherit Whatever()
member this.Value = value
override this.Map() = whatever.Z(value)

因此,为 C# 封装 F# 委托(delegate)和联合非常简单。我真的不在乎暴露事件模式,除非另有需要,否则它将是内部的。

您可能希望将 Some/None 类型包装在更可口的东西中,例如使用 Nullable<someValueType>代替Option<someValueType> , 并映射一个 nullNone 的引用类型需要的地方等等。

关于architecture - 将 F# 集成到现有的 .Net 应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007326/

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