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

假设想公开把其它的函数作为參数的函数。最好的方法是用托付(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

时间: 2024-11-08 23:59:09

公开的函数把函数作为參数的相关文章

标C编程笔记day06 动态分配内存、函数指针、可变长度參数

动态分配内存:头文件 stdlib.h malloc:分配内存 calloc:分配内存,并清零 realloc:调整已分配的内存块大小 演示样例: int *p=(int *) malloc(3*sizeof(int));//分配内存,成功返回首地址,失败返回NULL free(p);p=NULL;//释放分配的内存,并改动指针的值,避免出现野指针(指向一个地址,但地址已被回收) const 与指针: const int *p; //指针可变,指针相应的数据不可改动 int * const p;

copy_from_user/copy_to_user函数中的buf參数释疑

从開始了解内核開始就一直在疑惑 unsigned long copy_to_user(void __user *to, const void *from, unsigned long n); 这里面的from指针是什么?从用户空间的read到内核空间fops中的read函数过来后,这个值是否经过了转换?是物理地址还是直接是用户进程地址空间中的虚拟地址? 今天特地做了个实验,最后得出答案是后者,from的值就是用户进程地址空间中的虚拟地址. kernel要想得到详细的物理地址还须要进行一系列的权限

管理线程之向线程函数传递參数

向线程函数传递參数在构造线程对象时就可以完毕.可是要记住,默认情况下是把參数复制到线程内部,即使在函数中使用的是引用.比如 void f(int i,std::string const &s); std::thread t(f,3,"hello"); 上面代码中,函数f的第二个參数是std::string,传递的是char const *会转换为string. 当使用指针指向自己主动变量时.要特别注意: void f(int i, std::string const&

Python学习笔记7:函数对象及函数对象作參数

一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给func. func的调用与正常函数无异. 上面的代码等价于: def fun2(x, y): return x + y 二.函数作为參数 函数能够作为一个对象.进行參数传递. 比如: fun = lambda x ,y : x+y def runFun(fun, a, b): print fun(

linux下改动内核參数进行Tcp性能调优 -- 高并发

前言: Tcp/ip协议对网络编程的重要性,进行过网络开发的人员都知道,我们所编写的网络程序除了硬件,结构等限制,通过改动Tcp/ip内核參数也能得到非常大的性能提升, 以下就列举一些Tcp/ip内核參数,解释它们的含义并通过改动来它们来优化我们的网络程序,主要是针对高并发情况. 这里网络程序主要指的是server端 1. fs.file-max 最大能够打开的文件描写叙述符数量.注意是整个系统. 在server中.我们知道每创建一个连接,系统就会打开一个文件描写叙述符,所以,文件描写叙述符打开

Swift的函数与函数指针、闭包Closure等相关内容介绍

<span style="font-size:24px;">//函数 //demo1 无參数类型 func testConcat(){ println("測试函数"); } testConcat()//调用demo1 //demo2 多參数,一个返回值 /* 函数以func开头,表示一个函数 v1表示參数.String參数类型 ->返回值类型String */ func testConcats(v1:String,v2:String) ->S

可变參数学习笔记

一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个參数format固定以外,后面跟的參数的个数和类型是可变的(用三个点"-"做參数占位符),实际调用时能够有下面的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,s

Scala入门到精通——第二十节 类型參数(二)

本节主要内容 Ordering与Ordered特质 上下文界定(Context Bound) 多重界定 类型约束 1. Ordering与Ordered特质 在介绍上下文界定之前,我们对scala中的Ordering与Ordered之间的关联与差别进行解说,先看Ordering.Ordered的类继承层次体系: 通过上面两个图能够看到,Ordering混入了java中的Comparator接口.而Ordered混入了java的Comparable接口.我们知道java中的Comparator是一

C语言变长參数的认识以及宏实现

1.认识 变长參数是C语言的特殊參数形式.比如例如以下函数声明: int printf(const char *format, ....); 如此的声明表明,printf函数除了第一个參数类型为const char*之外,其后能够追加随意数量.随意类型的參数. printf的实现,粗略地举个样例. 如果lastarg是变长參数函数的最后一个具名參数(比如printf里的format),那么在函数内部定义类型的va_list的变量: va_list ap; 该变量以后将会依次指向各个可变參数. a