Python lambda:纯正的 λ 演算味儿

2021-04-08 11:27:24 +08:00
 abersheeran

最近看了一下 λ 演算。比如说,众所周知的 λ 演算里没有 a = b,赋值都靠函数参数来搞定。而 Python 也不允许你在 lambda 里写赋值操作,如果学习过 λ 演算,写 Python 的 lambda 其实感觉还行,至少不会说它难用。

看的时候顺便整了个活,Y 组合子。https://gist.github.com/abersheeran/80709d4ffd7e83c1206dbcc8df11d4d5

Y = lambda g: (lambda f: g(lambda arg: f(f)(arg))) (lambda f: g(lambda arg: f(f)(arg)))

if __name__ == "__main__":
    fib = Y(lambda f: lambda n: (1 if n < 3 else f(n-1) + f(n-2)))
    print(fib(10))
4749 次点击
所在节点    Python
41 条回复
bleepbloop
2021-04-08 11:32:09 +08:00
生活已经很艰难了,为什么要给自己添堵(狗头)
atuocn
2021-04-08 11:41:22 +08:00
只能写一行,难不难用?
hsfzxjy
2021-04-08 11:51:32 +08:00
没有 Monad 语法糖就很难受 :doge:
EPr2hh6LADQWqRVH
2021-04-08 11:57:43 +08:00
就这可读性,告别工作了
exceldream
2021-04-08 11:59:48 +08:00
不应该是 haskell 吗
wellsc
2021-04-08 12:00:41 +08:00
python 的 lambda 就算了,就一玩具
hahastudio
2021-04-08 12:05:50 +08:00
aguesuka
2021-04-08 12:07:19 +08:00
@exceldream 纯正的 lambda 演算就是λ,而没有λ2,λω,λP 。很合理
iintothewind
2021-04-08 12:08:54 +08:00
fib(99) 会不会很慢?
还是来个伪递归优化的版本吧
CismonX
2021-04-08 12:18:34 +08:00
纯正的 lambda 演算,当然要看 Unlambda 语言。这个语言只有组合子,其他什么都没有 [doge]

它的设计理念基于 SKI combinator calculus,只用其中的 s 和 k 两个组合子,就能做到图灵完备。当然 Unlambda 还有 call/cc,有 promise,有 I/O 函数,所以写起来也挺有趣的

我之前还写过 Unlambda 的几个实现,(见我发过的帖子),实现起来也很有趣
abersheeran
2021-04-08 12:24:54 +08:00
@atuocn 但凡你学过一点语言相关的东西,就知道,这不是只允许一行,是只允许一个表达式,至于你用几行,那是你的自由。而但凡看过 λ 演算,你应该知道那玩意里就不存在什么过程(多表达式),一个表达式就够用了。

@hsfzxjy 哈哈哈,确实是有 Python 的库支持 Monad,不过我觉得在 Python 里太多余了。
abersheeran
2021-04-08 12:28:12 +08:00
@avastms 函数式编程宗教教徒震怒!什么,你居然理解不了 Y 组合子,这是你的问题,不是我代码的问题!😀😀😀
abersheeran
2021-04-08 12:31:40 +08:00
@CismonX 嗯嗯,只是想给 Python lambda 正名一下,倒也不是想在 Python 里复兴 λ 演算。

几个大佬说不好用,一群菜鸟跟着说不好用。自己也不想想不好用在哪儿。一群人,人云亦云。上一次遇到这事,还是 C 里的 goto 。
aaaron7
2021-04-08 12:35:28 +08:00
正不正宗的,重要吗,只支持表达式本来就是很不好用的体现。

这和大不大佬,菜不菜鸡没关系,是个人都能用出来 python 的 lambda 难用的一笔。对比 swift 的 closure,c++的 lambda 。
abersheeran
2021-04-08 12:42:55 +08:00
@aaaron7 一个语言有一个语言的风格。Python 本身就不鼓励大量使用 lambda,而应该直接 def function 。你拿着其他语言的使用经验来说 Py 匿名函数不好用,那确实不好用。你用 Python 的思维去写 Python,这玩意才好用。明白吗?

我写 Python 就是 Python,写 JavaScript 就是 JavaScript 。我从来不写 JavaScript 风格的 Python,也不写 Python 风格的 JavaScript 。所以我从不觉得 Python lambda 难用,也从不觉得 JavaScript 的箭头匿名函数用不上。
guyeu
2021-04-08 13:05:14 +08:00
这不 pythonic
nthhdy
2021-04-08 13:07:49 +08:00
理解 lambda calculus 本身有难度。
用 python 写 lambda calculus 的难度相比之下不算什么。
chanchan
2021-04-08 13:24:03 +08:00
函数式教徒不应该来这
aaaron7
2021-04-08 13:32:41 +08:00
@abersheeran 那为啥 java 、c++、swift 、js 都能解决好的需求,到 python 这就不行了呢?

认可一个语言有一个语言的风格,但 python 的这个“风格”还不让人觉得难用吗?

咱能用直觉来看问题吗?
abersheeran
2021-04-08 13:35:17 +08:00
@aaaron7 喔。C 连 lambda 都不能写,那可真是一个“垃圾”,Python 深受 C 思想荼毒,lambda 也不支持过程,也是个垃圾。你已经得到满意的回答了,可以继续用你的直觉写代码去了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/768990

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX