使用 lambda 定义可以带来啥乐趣?

     2023-04-18     174

关键词:

【中文标题】使用 lambda 定义可以带来啥乐趣?【英文标题】:What fun can be had with lambda-definitions?使用 lambda 定义可以带来什么乐趣? 【发布时间】:2011-01-18 13:19:35 【问题描述】:

没有让他们这么多使用它们,我不太确定所有的方式 可以使用 lambda 定义(除了 map/collect/do/lightweight 本地函数语法)。对于有兴趣发布一些示例的任何人:

提供解释以帮助读者了解如何使用 lambda 定义;

示例的首选语言:Python、Smalltalk、Haskell。

【问题讨论】:

【参考方案1】:

您可以使用 lambda 构建函数式数据结构。这是一个简单的 - 一个函数列表(Python),支持addcontains 方法:

empty = lambda x : None

def add(lst, item) :
    return lambda x : x == item or lst(x)

def contains(lst, item) :
    return lst(item) or False

我只是为了好玩而快速编写代码 - 请注意,您不能按原样添加任何虚假值。它也不是尾递归的,因为它应该是一个好的功能结构。供读者练习!

【讨论】:

会改变它工作吗? def contains(lst, item) : 返回 lst(item) 或无【参考方案2】:

您可以将它们用于控制流。例如,在 Smalltalk 中,“ifTrue:ifFalse:”方法是布尔对象的一种方法,在 True 和 False 类中的每一个都有不同的实现。表达式

someBoolean ifTrue: [self doSomething] ifFalse: [self doSomethingElse]

使用两个闭包——块,在 Smalltalk 语法中的 [方括号] 中——一个用于真分支,一个用于假分支。对于 True 类的实例,“ifTrue:ifFalse:”的实现是

ifTrue: block1 ifFalse: block2
    ^ block1 value

对于 False 类:

ifTrue: block1 ifFalse: block2
    ^ block2 value

在这里,闭包用于延迟评估,以便可以做出关于控制流的决定,根本不需要任何专门的语法(除了块的语法)。

Haskell 有点不同,它的惰性求值模型在许多情况下有效地自动产生闭包的效果,但在 Scheme 中,您最终会大量使用 lambdas 进行控制流。例如,这是一个从关联列表中检索值的实用程序,在该值不存在的情况下提供可选计算的默认值:

(define (assq/default key lst default-thunk)
  (cond
    ((null? lst) (default-thunk)) ;; actually invoke the default-value-producer
    ((eq? (caar lst) key) (car lst))
    (else (assq/default key (cdr lst) default-thunk))))

它会被这样调用:

(assq/default 'mykey my-alist (lambda () (+ 3 4 5)))

这里的关键是使用 lambda 来延迟默认值的计算,直到实际知道需要它为止。

另请参见 continuation-passing-style,它把这种情况发挥到了极致。例如,Javascript 依赖于持续传递样式和闭包来执行其所有阻塞操作(如休眠、I/O 等)。

ETA:我在上面所说的闭包是指词法作用域闭包。通常,词法作用域很关键。

【讨论】:

你能添加一个词法作用域的描述吗? @Roman: 词法作用域意味着如果你有像f := a -> (x -> (a++)*x) 这样的函数,调用f(2) 将返回函数x -> (a++)*xa 绑定到具有值 2。因为这是从词汇意义上定义函数的范围内的 a。然而,这个a 完全独立于f(3) 或另一个f(2) 调用返回的函数中的a,因为每个调用都会创建一个新的闭包。【参考方案3】:

您可以使用 lambda 来创建 Y Combinator,这是一个接受另一个函数并返回它的递归形式的函数。这是一个例子:

def Y(le):
    def _anon(cc):
        return le(lambda x: cc(cc)(x))
    return _anon(_anon)

这是一个值得更多解释的思想大棒,但不要在这里反刍,请查看this blog entry(上面的示例也来自那里)。

【讨论】:

【参考方案4】:

它是 C#,但我个人每次阅读这篇文章时都会受到启发:

Building Data out of Thin Air - 在 C# 中实现 Lisp 的 cons、car 和 cdr 函数。它展示了如何完全使用 lambda 函数构建简单的堆栈数据结构。

【讨论】:

【参考方案5】:

它与 haskell 等中的概念并不真正完全相同,但在 C# 中,lambda 构造具有(可选)编译为表示代码的 objcet 模型的能力(表达式树)而不是代码本身(这本身就是 LINQ 的基石之一)。

这反过来又可以带来一些非常有表现力的元编程机会,例如(这里的 lambda 表示“给定一个服务,你想用它做什么?”):

var client = new Client<ISomeService>();
string captured = "to show a closure";
var result = client.Invoke(
    svc => svc.SomeMethodDefinedOnTheService(123, captured)
);

(假设有合适的Invoke 签名)

这种类型的东西有很多用途,但我用它来构建不需要任何运行时代码生成的 RPC 堆栈 - 它只是解析表达式树,找出调用者的意图,将其转换为 RPC、调用它、收集响应等(更多讨论 here)。

【讨论】:

【参考方案6】:

Haskell 中使用数值近似计算单个变量函数导数的示例:

deriv f = \x -> (f (x + d) - f x) / d
  where
    d = 0.00001

f x = x ^ 2
f' = deriv f -- roughly equal to f' x = 2 * x

【讨论】:

计划中的 lambda 有啥意义?

...522:47:55【问题描述】:我正在学习计划。我知道如何同时使用lambda和let表达式。但是我很难弄清楚使用lambda的意义何在。你不能用let做所有你可以用lambda做的事情吗?看一个lambda表达式比let更好的选择的例子会特别有帮助。另外... 查看详情

在为 AWS Lambda 部署压缩虚拟环境时,我可以省略啥?

...布时间】:2017-08-0907:07:49【问题描述】:简介我刚刚开始使用AWSLambda,尽管我讨厌它,但我非常喜欢它。我已经创建了aMakefiletohelpme打包我的 查看详情

有啥理由不使用全局 lambda?

】有啥理由不使用全局lambda?【英文标题】:Anyreasonnottousegloballambdas?有什么理由不使用全局lambda?【发布时间】:2020-04-0805:56:06【问题描述】:我们有一个在自身内部使用非捕获lambda的函数,例如:voidfoo()autobar=[](inta,intb)returna+... 查看详情

lambda和常规函数之间的python有啥区别?

...区别-在python级别。(我知道程序员有什么区别以及何时使用它们。)>&g 查看详情

为啥你可以重新定义 `lambda`?

...为:计划1:(definea(begin(display"hmmm")(newline)lambda))这个程序使用schemetest.ss运行,在lambda行给我一个语法错误,而没有打印 查看详情

可以用 lambda 替换 Listener 是啥意思?

】可以用lambda替换Listener是啥意思?【英文标题】:WhatdoesitmeanthataListenercanbereplacedwithlambda?可以用lambda替换Listener是什么意思?【发布时间】:2015-08-2511:33:18【问题描述】:我已经实现了一个AlertDialog,带有正常的负按钮和正按钮... 查看详情

有啥方法可以在 AWS Lambda 中获取 Cognito 用户名?

...,AWSLambda函数无法查找我的Cognito用户的用户名(我正在使用UserPools)。这似乎非常奇怪,因为我认为到处都是应用 查看详情

有啥方法可以判断函数对象是 lambda 还是 def?

】有啥方法可以判断函数对象是lambda还是def?【英文标题】:Isthereanywaytotellifafunctionobjectwasalambdaoradef?有什么方法可以判断函数对象是lambda还是def?【发布时间】:2019-10-2009:43:30【问题描述】:考虑以下两个函数:deff1():return"pota... 查看详情

调用 lambda 时,“DisplayClass”名称是啥意思?

...】:2013-04-3009:24:54【问题描述】:根据thisanswer,当代码使用来自lambda方法内部的局部变量时,编译器将生成额外的类,这些类可以具有诸如c_ 查看详情

oracle的多实例集群有啥特征,能够为企业用户带来啥

...库(database):物理操作系统文件或磁盘(disk)的集合。使用Oracle10g的自动存储管理(AutomaticStorageManagement,ASM)或RAW分区时,数据库可能不作为操作系统中单独的文件,但定义仍然不变。q实例(instance):一组Oracle后台进程/线... 查看详情

lambda啥意思

...例句]Usinga lambda expression,wecanmakethismore compact在使用lambda表达式时,可以使代码更加简洁[其他]  复数:lambdas  扩展资料Lambda用在基于方法的LINQ查询中,作为诸如Where和Where等标准查询运算符方法的参数。... 查看详情

python中的lambda和lambda有啥区别

参考技术APython的lambda里只能写一行啦、不能有statement只能有expression啦,这些还是小问题,真正的问题是Python对Closure的实现根本是有缺陷的。闭包的实现都是错误的,哪来的真正的匿名函数?比如在Python2里这样的代码是没法运... 查看详情

“lambda”在 Python 中是啥意思,最简单的使用方法是啥?

】“lambda”在Python中是啥意思,最简单的使用方法是啥?【英文标题】:Whatdoes"lambda"meaninPython,andwhat\'sthesimplestwaytouseit?“lambda”在Python中是什么意思,最简单的使用方法是什么?【发布时间】:2010-12-0716:54:15【问题描述... 查看详情

java8的lamda有啥意义

...来说,一句表达式即解决 参考技术Bjava8中的新特性支持Lambda表达式.引入Lambda,最直观的一个意义是,不用再写大量的匿名内部类。事实上,还有更多由于函数式编程本身特性带来的提升。比如:代码的可读性会更好、高阶函数... 查看详情

java8新特性之一:lambda表达式

...代码,可以将代码像传递参数、传递数据一样进行传输。使用Lambda表达式,可以写出更加紧凑、更加简洁、更加灵活的代码 查看详情

函数式编程-lambda与stream

参考技术A我们在创建线程并启动时可以使用匿名内部类的写法:可以使用Lambda的格式对其进行修改。修改后如下:现有方法定义如下,其中IntBinaryOperator是一个接口。先使用匿名内部类的写法调用该方法。Lambda写法:现有方法定... 查看详情

lambda表达式由啥组成

参考技术ALambda表达式是什么?可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。匿名——我们说匿名,是因为它不像... 查看详情

[python]uselambdaexpressionstodefineafunction/使用lambda表达式定义函数(代码片段)

https://docs.python.org/zh-cn/3/tutorial/controlflow.html 4.7.5.Lambda表达式¶可以用 lambda 关键字来创建一个小的匿名函数。这个函数返回两个参数的和: lambda a, b: a+b 。Lambda函数可以在需要函数对象的任何地... 查看详情