在c#中使用f#数据类型
本文关键字:数据类型 | 更新日期: 2023-09-27 18:15:33
更具体地说,我真的想要一个不可变/共享的链表,我认为拥有不可变的映射和集合也会很好。只要我不需要担心核心实现,我就可以很容易地添加扩展方法/子类/包装它,以提供一个相当光滑的外部接口供我使用。
有什么理由我不应该这样做吗?性能、不兼容性等等?
FSharpx包含了几个"适配器",这样f#集合可以在c#中更舒适地使用。下面是一个简短的例子:
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#库中的类型(如Set
, Map
和list
)不是为c#设计的,所以我通常不建议直接使用它们。这是可以做到的,而且一些基本操作也会很好地工作(例如,向不可变映射添加元素并检查元素是否存在)。然而,也有一些问题:
-
f#也有模块的功能(
MapModule
用于不可变映射),作为c#用户,你会期望看到这些成员。 -
f#函数没有被表示为
Func<_, _>
委托,而是使用一些特殊的f#特定方式。
Func<_, _>
委托,并在模块中调用f#高阶函数。