如何从C#应用程序将F#函数传递到另一个F#函数?
|
我有包含两个功能的F#类库程序集:
let add a b = a + b
和
let rec aggregateList list init (op:int -> int -> int) =
match list with
|[] -> init
|head::tail ->
let rest = aggregateList tail init op
op rest head
我有一个引用F#库的C#控制台应用程序,并尝试执行以下操作:
FSharpList<int> l = new FSharpList<int>(1, new FSharpList<int>(2, FSharpList<int>.Empty));
int result = myFsLibrary.aggregateList(l, 0, myFsLibrary.add);
但是,编译器抱怨[myFsLibrary.add]无法从\'method group \'转换为FSharpFunc<int, FSharpFunc<int, int>>
没有找到相关结果
已邀请:
3 个回复
闪票仇门韧
委托显式创建一个函数。在C#中,创建将所有参数作为元组的函数更方便,因此您可以执行此操作,然后使用
将函数转换为咖喱类型。就像是:
但是,如果需要从C#代码中调用某些F#函数,则建议公开一个具有C#友好接口的函数。在这种情况下,我可以使用
委托,并且第一个参数应为
而不是特定于F#的列表类型:
然后,您的C#应用程序就可以使用:
筷啸够对铅
疮痪徘弦漏
C#和大多数.Net语言将其视为采用2个12位参数并返回单个12位值的方法。 F#虽然看不到这种功能。而是将
视为函数将
并返回一个函数,该函数又将takse
并返回
。这种功能视图使实现类似于curring的操作非常容易。 为了将世界的C#视图转换为F#,您需要做一些魔术才能将方法折叠到自身上。我通过定义一组F#工厂和扩展方法来完成这项任务,以达到我的目的。例如
我可以使用该库为
方法获取合适的F#委托类型,如下所示