Lambda表达式

11

有人可以解释一下lambda表达式以及它们可以用来做什么吗?我已经在谷歌上搜索了一下,对此有了大致的了解。大多数示例给出的是C#代码。那么,在旧的普通C语言中如何使用lambda表达式呢?


以下是对el.pescado的回复,由于C语言非常明显地是一种命令式语言,因此不支持创建匿名方法(函数)。C语言最接近匿名函数的方式是通过函数指针,例如传递给qsort(3)的比较器函数指针(但它们并不真正是匿名的,因为它们需要被定义和命名)。 - msw
4个回答

13

实际上,有两种被称为“lambda表达式”的东西,它们之间关系相对松散:

  1. Lambda表达式是lambda演算的基本部分,与函数式编程密切相关。

  2. 在命令式语言中,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);

1
据称,苹果已经在LLVM中添加了一种lambda表达式到C语言(代码块或其他)。虽然这不是官方标准,但我已经忘记了确切的搜索术语。 - ndim
代码块是Objective-C的一部分(苹果公司用于大多数高级库),它是带有附加OO语法的C语言。 - Rudy Velthuis

2

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语言中不起作用。el.pescado创建了一个非常简单的lambda,但要创建一个更复杂的lambda是不可能的。 - Eyal
抱歉,如果你只看这个答案,可能不太清楚。谢谢。 - pmb

1

C语言不支持lambda表达式...如果你懂Perl,我强烈推荐阅读《Higher Order Perl》这本书,它会在一个熟悉(如果你懂Perl)和实用的环境中为你提供各种函数式编程技术的绝佳介绍。


-1

MSDN上看这里


我猜他的意思是C++而不是C。我认为这是一个合理的假设。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接