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