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

时间:2011-11-23 07:49:45

标签: c# collections f# immutability

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

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

2 个答案:

答案 0 :(得分:7)

FSharpx包含一些“适配器”,因此可以在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"));

目前没有太多文档,但您可以使用tests作为参考。它并不包含绝对的每个操作(我不介意在C#中直接使用MapModule之类的东西),但是如果你发现任何你需要丢失的东西,请分叉存储库并添加它!

几周前我也blogged about this

或者您可以尝试使用其中一种persistent collections in C#

答案 1 :(得分:5)

F#库中的类型(例如SetMaplist)并非设计用于C#,因此我一般不建议直接使用它们。它可以完成并且一些基本操作将很好地工作(例如,将元素添加到不可变映射并检查元素是否存在)。但是,有一些问题:

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

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

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