首页 > 代码库 > 公开的函数把函数作为参数
公开的函数把函数作为参数
公开的函数把函数作为参数
如果想公开把其他的函数作为参数的函数,最好的方法是用委托(delegate)。考虑下面的例子,定义了两个函数,一个是公开函数,另一个把函数公开为委托。
module Strangelights.DemoModuleopen System
/// a function that provides filtering
let filterStringList f ra =
ra |>Seq.filter f
// another function that provides filtering
let filterStringListDelegate (pred:Predicate<string>) ra =
let f x =pred.Invoke(x)
newResizeArray<string>(ra |> Seq.filter f)
虽然,filterStringList 要比 filterStringListDelegate 短很多,但是,库用户会感谢你为把函数公开为委托而付出的努力。当从 C# 中调用这个函数时,就能更加清晰地体会到为什么这样。
下面的例子演示了调用filterStringList。调用这个函数,你需要创建委托,然后,使用FuncConvert 类把它转换成FastFunc,这是一种 F# 类型,用来表示函数值。对于库用户来说,还有一件相当讨厌的事情,需要依赖于FSharp.Core.dll,而用户可能并不想用它。
// !!! C# Source !!!
using System;
usingSystem.Collections.Generic;
usingStrangelights;
usingMicrosoft.FSharp.Core;
class MapOneClass{
public static void MapOne() {
// define a list of names
List<string> names = new List<string>(
new string[] { "Stefany", "Oussama",
"Sebastien", "Frederik"});
// define a predicate delegate/function
Converter<string, bool> pred =
delegate(string s) {return s.StartsWith("S");};
// convert to a FastFunc
FastFunc<string, bool> ff =
FuncConvert.ToFastFunc<string,bool>(pred);
// call the F# demo function
IEnumerable<string> results =
DemoModule.filterStringList(ff, names);
// write the results to the console
foreach (var name inresults) {
Console.WriteLine(name);
}
}
}
示例的运行结果如下:
Stefany
Sebastien
现在,把它与调用filterStringListDelegate 函数进行对比,在下面的例子中展示。因为已经使用了委托,就可以使用 C# 的匿名委托功能,并把委托直接嵌入函数调用中,减少了库用户的工作量,且不需要对FSharp.Core.dll 的编译时依赖。
// !!! C# Source !!!
using System;
usingSystem.Collections.Generic;
usingStrangelights;
class MapTwoClass{
public static void MapTwo() {
// define a list of names
List<string> names = new List<string>(
new string[] { "Aurelie", "Fabrice",
"Ibrahima", "Lionel"});
// call the F# demo function passing in an
// anonymous delegate
List<string> results =
DemoModule.filterStringListDelegate(
delegate(string s) {return s.StartsWith("A");}, names);
// write the results to the console
foreach (var s inresults) {
Console.WriteLine(s);
}
}
}
示例的运行结果如下:
Aurelie