有人可以解释一下lambda表达式以及它们可以用来做什么吗?我已经在谷歌上搜索了一下,对此有了大致的了解。大多数示例给出的是C#代码。那么,在旧的普通C语言中如何使用lambda表达式呢?
实际上,有两种被称为“lambda表达式”的东西,它们之间关系相对松散:
Lambda表达式是lambda演算的基本部分,与函数式编程密切相关。
在命令式语言中,Lambda表达式通常是匿名方法的同义词。例如,在C#中,您可以将Lambda表达式(即表达式本身,而不仅仅是其结果)作为参数传递:
C#:
someCollection.Apply (x => 2*x); // apply expression to every object in collection
// equivalent to
someCollection.Apply (delegate (int x) { return 2 * X; });
话虽如此,C语言不支持匿名方法。但您可以使用函数指针来实现类似的结果:
int multiply (int x)
{
return 2 * x;
}
...
collection_apply (some_collection, multiply);
el.pescado的回答是正确的,但他提供的示例有一个简单的解决方法,可以使用函数指针。许多lambda函数的用途无法通过c的函数指针解决。
假设您在c中编写了这些函数:
int Multiply_1(int x) { return(x*1); }
int Multiply_2(int x) { return(x*2); }
int Multiply_3(int x) { return(x*3); }
int Multiply_4(int x) { return(x*4); }
etcetera, to infinity
这些都很容易理解。现在假设您想编写一个函数,该函数以y作为输入并返回指向函数Multiply_y()的指针:
(int)(int) *Make_Multiplier(int y) { return(Multiply_y); }
"Multiply_y"是一个动态创建的函数,其形式为Multiply_1、Multiply_2等。具有一流lambda函数的语言可以这样做。
C语言不支持lambda表达式...如果你懂Perl,我强烈推荐阅读《Higher Order Perl》这本书,它会在一个熟悉(如果你懂Perl)和实用的环境中为你提供各种函数式编程技术的绝佳介绍。
qsort(3)
的比较器函数指针(但它们并不真正是匿名的,因为它们需要被定义和命名)。 - msw