C# 在C中使用F#数据类型#

C# 在C中使用F#数据类型#,c#,collections,f#,immutability,C#,Collections,F#,Immutability,更具体地说,我真的想要一个不可变/共享的链表,我认为拥有不可变的映射和集合也会很好。只要我不必担心核心实现,我就可以轻松地添加扩展方法/子类/包装它,为自己提供一个合理光滑的外部接口 有什么理由我不应该这样做吗?性能、不兼容等?F#库中的类型(如集合、映射和列表)不是设计用于C#的,因此我一般不建议直接使用它们。这是可以做到的,一些基本操作也会很好地工作(例如,向不可变映射添加元素并检查元素是否存在)。但是,也存在一些问题: F#还具有模块中的功能(MapModule用于不可变映射),作为C#

更具体地说,我真的想要一个不可变/共享的链表,我认为拥有不可变的映射和集合也会很好。只要我不必担心核心实现,我就可以轻松地添加扩展方法/子类/包装它,为自己提供一个合理光滑的外部接口

有什么理由我不应该这样做吗?性能、不兼容等?

F#库中的类型(如
集合
映射
列表
)不是设计用于C#的,因此我一般不建议直接使用它们。这是可以做到的,一些基本操作也会很好地工作(例如,向不可变映射添加元素并检查元素是否存在)。但是,也存在一些问题:

  • F#还具有模块中的功能(
    MapModule
    用于不可变映射),作为C#用户,您希望将这些模块视为成员

  • F#函数不表示为
    Func
    委托,而是使用一些特殊的F#特定方式。这意味着使用高阶函数将很困难

总之,我认为更好的方法是将F#数据类型封装到一个类中(在F#中实现),该类以友好的方式向C#开发人员公开您需要的方法。例如,您可以轻松声明一个F#方法,该方法接受
Func
委托并在模块中调用F#高阶函数。

包括两个“适配器”,以便在C#中更方便地使用F#集合。下面是一个简短的例子:

var a = FSharpList.Create(1, 2, 3);
var b = a.Cons(0);
b.TryFind(x => x > 4)
 .Match(v => Console.WriteLine("I found a value {0}", v),
        () => Console.WriteLine("I didn't find anything"));
现在没有太多的文档,但是您可以使用作为参考。它并没有包含所有的操作(我不介意在C中直接使用
MapModule
之类的东西太多),但是如果您发现缺少什么,请打开存储库并添加它

我也在几周前


或者您可以尝试使用的这些实现之一。

这是一个非常普遍的问题,因此几乎无法回答。也许你可以用代码片段把它限制在一种情况下?同样普遍的答案是:视情况而定。不变性也可以在c#中实现,但当特定的F#特性(如更好的类型推断)或数据类型(如option)做得更好时,那么…@GertArnold:具体来说,我指的是FSharpList、FSharpSet、FSharpMap,以及从c#调用它们的可能性,作为在c#中滚动我自己的不可变列表/集/映射的替代方案,我认为托马斯给出了一个很好的答案。奥利弗·斯特姆(Oliver Sturm)擅长用C#方式做功能性的东西。但我想你会想用API制作一个F#库。