Li *_*oyi 2 c# collections f# immutability
更具体地说,我真的想要一个不可变/共享的链表,我认为拥有不可变的地图和集合也会很好.只要我不必担心核心实现,我就可以轻松添加扩展方法/子类/包装它,为我自己提供一个合理的外部接口.
我有什么理由不这样做吗?性能,不兼容性等?
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"));
Run Code Online (Sandbox Code Playgroud)
目前没有太多文档,但您可以使用测试作为参考.它不包括绝对的每一个操作(我不介意直接使用像MapModuleC#这样的东西),但如果你发现任何你需要丢失的东西,请分叉存储库并添加它!
几周前我也在博客上发表过这篇文章.
F#库中的类型(例如Set,Map和list)并非设计用于C#,因此我一般不建议直接使用它们.它可以完成并且一些基本操作将很好地工作(例如,向不可变映射添加元素并检查元素是否存在).但是,有一些问题:
F#还具有模块中的功能(MapModule对于不可变映射)和作为C#用户,您可能希望将它们视为成员.
F#函数不表示为Func<_, _>委托,而是使用一些特殊的F#特定方式.这意味着使用高阶函数将很困难.
总而言之,我认为更好的方法是将F#数据类型包装到一个类(以F#实现)中,以友好的方式向C#开发人员公开所需的方法.例如,您可以轻松声明一个F#方法,该方法接受Func<_, _>委托并在模块中调用F#高阶函数.
| 归档时间: |
|
| 查看次数: |
979 次 |
| 最近记录: |