在c#中使用f#数据类型

本文关键字:数据类型 | 更新日期: 2023-09-27 18:15:33

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

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

在c#中使用f#数据类型

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, Maplist)不是为c#设计的,所以我通常不建议直接使用它们。这是可以做到的,而且一些基本操作也会很好地工作(例如,向不可变映射添加元素并检查元素是否存在)。然而,也有一些问题:

  • f#也有模块的功能(MapModule用于不可变映射),作为c#用户,你会期望看到这些成员。

  • f#函数没有被表示为Func<_, _>委托,而是使用一些特殊的f#特定方式。

所以,总而言之,我认为更好的方法是将f#数据类型包装到一个类中(用f#实现),以友好的方式向c#开发人员公开所需的方法。例如,你可以很容易地声明一个f#方法,它接受Func<_, _>委托,并在模块中调用f#高阶函数。