首页 > 代码库 > 公开的函数把函数作为参数

公开的函数把函数作为参数

公开的函数把函数作为参数

 

如果想公开把其他的函数作为参数的函数,最好的方法是用委托(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