对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
当前回答
Ruby中lambda的示例如下:
hello = lambda do
puts('Hello')
puts('I am inside a proc')
end
hello.call
将生成以下输出:
Hello
I am inside a proc
其他回答
@Brian我一直在C#、LINQ和非LINQ运算符中使用lambdas。例子:
string[] GetCustomerNames(IEnumerable<Customer> customers)
{ return customers.Select(c=>c.Name);
}
在C#之前,我在JavaScript中使用匿名函数来回调AJAX函数,甚至在AJAX这个词出现之前:
getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});
不过,C#lambda语法的有趣之处在于,它们本身的类型无法推断(即,您不能键入var foo=(x,y)=>x*y),但根据它们被分配给的类型,它们将被编译为表示表达式的委托或抽象语法树(这就是LINQ对象映射器如何实现“语言集成”的魔力)。
LISP中的Lambdas也可以传递给引号运算符,然后作为列表列表进行遍历。一些强大的宏是这样生成的。
因为我在这里看不到C++11示例,所以我将继续在这里发布这个很好的示例。经过搜索,这是我能找到的最清晰的语言特定示例。
你好,Lambdas,版本1
template<typename F>
void Eval( const F& f ) {
f();
}
void foo() {
Eval( []{ printf("Hello, Lambdas\n"); } );
}
你好,Lambdas,版本2:
void bar() {
auto f = []{ printf("Hello, Lambdas\n"); };
f();
}
“lambda”这个名字只是一个历史产物。我们所谈论的只是一个表达式,其值是一个函数。
一个简单的例子(下一行使用Scala)是:
args.foreach(arg => println(arg))
其中foreach方法的参数是匿名函数的表达式。上面的一行与编写类似的代码大致相同(不是真正的代码,但你会明白的):
void printThat(Object that) {
println(that)
}
...
args.foreach(printThat)
除了你不需要麻烦:
在其他地方声明函数(稍后重新访问代码时必须查找它)。命名你只使用一次的东西。
一旦你习惯了函数值,就不得不不使用它们,就像需要命名每个表达式一样愚蠢,比如:
int tempVar = 2 * a + b
...
println(tempVar)
而不是只在需要的地方编写表达式:
println(2 * a + b)
确切的符号因语言而异;希腊语并不总是必需的!;-)
我很难理解lambda表达式,因为我在Visual FoxPro中工作,它具有宏替换以及ExecScript{}和Evaluate()函数,这两个函数似乎起着相同的作用。
? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");
FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)
使用正式lambda的一个明确好处是(我假设)编译时检查:Fox在尝试运行之前不会知道您是否键入了上面的文本字符串。
这对于数据驱动的代码也很有用:您可以将整个例程存储在数据库中的备注字段中,然后在运行时对其求值。这允许您调整应用程序的一部分,而无需实际访问源代码。(但这完全是另一个话题。)
例如,在Javascript中,函数被视为与其他所有类型(int、string、float、bool)相同的混合类型。因此,您可以动态创建函数,将它们分配给对象,然后稍后再调用它们。它是有用的,但不是你想过度使用的东西,否则你会让所有在你之后必须维护代码的人感到困惑。。。
这是我玩的一些代码,看看这个兔子洞有多深:
var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }
for(var i=0 ;i<3; i++)
x.thingy[i]()()();
推荐文章
- 设计模式:工厂vs工厂方法vs抽象工厂
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- 什么是端点?
- 字符、码位、字形和字素之间的区别是什么?
- 使用'key'和lambda表达式的Python Max函数
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?
- “函数”和“过程”的区别是什么?
- 如何使用Java8 lambda对流进行反向排序?
- 跳跃表vs.二叉搜索树
- Kotlin中的' forEach '中的' break '和' continue '