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