由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Military版 - 函数式编程没有循环
进入Military版参与讨论
1 (共1页)
T********2
发帖数: 1
1
和没有mutable变量,本质上是同一个要求。因为mutable变量只在循环里是必需的。不
在循环里的话,那就是一步一步走,每一步如果需要记录结果的话,用不同的名字就好
了。只有在步数不确定的情况下才需要循环,需要一个结束条件,而这个条件里有一个
循环变量,它必须是mutable的。
l*******t
发帖数: 1430
2
循环本质是要保持一个上下文。直接把上下文放函参就解决了
图灵的洞察力和抽象力比他师傅邱琪差太多了
T********2
发帖数: 1
3
也就是说有递归的编程语言都可以进行函数式编程。

【在 T********2 的大作中提到】
: 和没有mutable变量,本质上是同一个要求。因为mutable变量只在循环里是必需的。不
: 在循环里的话,那就是一步一步走,每一步如果需要记录结果的话,用不同的名字就好
: 了。只有在步数不确定的情况下才需要循环,需要一个结束条件,而这个条件里有一个
: 循环变量,它必须是mutable的。

T********2
发帖数: 1
4
厉害啊。我想想。

【在 l*******t 的大作中提到】
: 循环本质是要保持一个上下文。直接把上下文放函参就解决了
: 图灵的洞察力和抽象力比他师傅邱琪差太多了

T********2
发帖数: 1
5
我觉得光有函数还是不够。要么有递归,要么有循环。有循环就需要mutable的循环变
量。

【在 l*******t 的大作中提到】
: 循环本质是要保持一个上下文。直接把上下文放函参就解决了
: 图灵的洞察力和抽象力比他师傅邱琪差太多了

T********2
发帖数: 1
6
给Church发一个图灵奖,老爷子当场自杀。

【在 l*******t 的大作中提到】
: 循环本质是要保持一个上下文。直接把上下文放函参就解决了
: 图灵的洞察力和抽象力比他师傅邱琪差太多了

i*****9
发帖数: 3157
7
用递归实现循环难道不是函数编程101?

【在 T********2 的大作中提到】
: 我觉得光有函数还是不够。要么有递归,要么有循环。有循环就需要mutable的循环变
: 量。

b***y
发帖数: 14281
8
不正确。即使步数是确定的一样必须有循环。比如写个函数从一加到N,N是函数的参数
。函数内部看步数已经确定,但不循环不行。当然用递归也行。

★ 发自iPhone App: ChinaWeb 1.1.5

【在 T********2 的大作中提到】
: 和没有mutable变量,本质上是同一个要求。因为mutable变量只在循环里是必需的。不
: 在循环里的话,那就是一步一步走,每一步如果需要记录结果的话,用不同的名字就好
: 了。只有在步数不确定的情况下才需要循环,需要一个结束条件,而这个条件里有一个
: 循环变量,它必须是mutable的。

T********2
发帖数: 1
9
谁说不是呢?

【在 i*****9 的大作中提到】
: 用递归实现循环难道不是函数编程101?
T********2
发帖数: 1
10
我想想。

【在 b***y 的大作中提到】
: 不正确。即使步数是确定的一样必须有循环。比如写个函数从一加到N,N是函数的参数
: 。函数内部看步数已经确定,但不循环不行。当然用递归也行。
:
: ★ 发自iPhone App: ChinaWeb 1.1.5

l*******t
发帖数: 1430
11
函数编程也可以没有if,用pattern match更好
其实学fp有几个基本操作的lambda实现非常有意思,应该自己手推一遍,pos/neg/
increase,true/ false/ if,recursive,还有functor,monad

【在 T********2 的大作中提到】
: 厉害啊。我想想。
T********2
发帖数: 1
12
我觉得这个有点儿玩赖了,参数N不确定,它还是应该算不固定次数。

【在 b***y 的大作中提到】
: 不正确。即使步数是确定的一样必须有循环。比如写个函数从一加到N,N是函数的参数
: 。函数内部看步数已经确定,但不循环不行。当然用递归也行。
:
: ★ 发自iPhone App: ChinaWeb 1.1.5

l*******t
发帖数: 1430
13
足够,这是有图灵等价性保证的
看看这个如何构造fold
https://www.cs.nott.ac.uk/~pszgmh/fold.pdf

【在 T********2 的大作中提到】
: 我觉得光有函数还是不够。要么有递归,要么有循环。有循环就需要mutable的循环变
: 量。

T********2
发帖数: 1
14
pattern match我知道Haskell里有。我就用python,也是functional programming。
这些都推过,但是functor和monad基本不怎么用。

【在 l*******t 的大作中提到】
: 函数编程也可以没有if,用pattern match更好
: 其实学fp有几个基本操作的lambda实现非常有意思,应该自己手推一遍,pos/neg/
: increase,true/ false/ if,recursive,还有functor,monad

l*******t
发帖数: 1430
15
你用map就是用monad

【在 T********2 的大作中提到】
: pattern match我知道Haskell里有。我就用python,也是functional programming。
: 这些都推过,但是functor和monad基本不怎么用。

g***n
发帖数: 14250
16
艹,这用递归不也很轻松吗。
还神码函数式编程,笑死了,那叫功能式编程好吧


: 不正确。即使步数是确定的一样必须有循环。比如写个函数从一加到N,N是函数
的参数

: 。函数内部看步数已经确定,但不循环不行。当然用递归也行。

: ★ 发自iPhone App: ChinaWeb 1.1.5



【在 b***y 的大作中提到】
: 不正确。即使步数是确定的一样必须有循环。比如写个函数从一加到N,N是函数的参数
: 。函数内部看步数已经确定,但不循环不行。当然用递归也行。
:
: ★ 发自iPhone App: ChinaWeb 1.1.5

T********2
发帖数: 1
17
这篇挺好的。我没看完。先对话一下。
fold就是reduce嘛。我考虑过。但是我觉得还是不够。
主要是对迭代的情况不够。我出个问题,理想情况的,不需要编程,描述一下办法就行。
比如一个函数f,接受一个变量,返回true false。编一个程序,有无穷长随机输入,
true的时候继续处理,false的时候停止处理。不用循环怎么编呢?

【在 l*******t 的大作中提到】
: 足够,这是有图灵等价性保证的
: 看看这个如何构造fold
: https://www.cs.nott.ac.uk/~pszgmh/fold.pdf

g***n
发帖数: 14250
18
光扯这些概念没用,不解决问题,歇吧
T********2
发帖数: 1
19
讨论的不是递归能不能代替循环的问题。

【在 g***n 的大作中提到】
: 艹,这用递归不也很轻松吗。
: 还神码函数式编程,笑死了,那叫功能式编程好吧
:
:
: 不正确。即使步数是确定的一样必须有循环。比如写个函数从一加到N,N是函数
: 的参数
:
: 。函数内部看步数已经确定,但不循环不行。当然用递归也行。
:
: ★ 发自iPhone App: ChinaWeb 1.1.5
:

T********2
发帖数: 1
20
嗯,对。那我天天用。我用list comprehension。

【在 l*******t 的大作中提到】
: 你用map就是用monad
l*******t
发帖数: 1430
21
这个显然不是。要能支持first class function,就是可以传递函数做参数

。不
就好
一个

【在 T********2 的大作中提到】
: 也就是说有递归的编程语言都可以进行函数式编程。
T********2
发帖数: 1
22
看了。fold我是了解的,所以我直接去找可能有疑问的地方。
fold做循环有两个问题,一个是无穷长输入,一个是early stop。
这两个问题都必须特殊处理,才可以说它能够“逻辑”上处理循环或递归。而递归是可
以完全代替循环的。

【在 l*******t 的大作中提到】
: 足够,这是有图灵等价性保证的
: 看看这个如何构造fold
: https://www.cs.nott.ac.uk/~pszgmh/fold.pdf

l*******t
发帖数: 1430
23
就是无限递归啊。所有fp都是缺省lazy的,你写出无限递归的函数但正常情况不会无限
递归,比如你写个无限加一的函数,你可能就是用在zip里加个index,数据递归结束无
限递归也跟着结束后面的操作都没进行

行。

【在 T********2 的大作中提到】
: 这篇挺好的。我没看完。先对话一下。
: fold就是reduce嘛。我考虑过。但是我觉得还是不够。
: 主要是对迭代的情况不够。我出个问题,理想情况的,不需要编程,描述一下办法就行。
: 比如一个函数f,接受一个变量,返回true false。编一个程序,有无穷长随机输入,
: true的时候继续处理,false的时候停止处理。不用循环怎么编呢?

C*****l
发帖数: 1
24
不是个事,c++就拿class当function就行了

【在 l*******t 的大作中提到】
: 这个显然不是。要能支持first class function,就是可以传递函数做参数
:
: 。不
: 就好
: 一个

T********2
发帖数: 1
25
嗯,那要看你怎么定义函数式编程了。你如果非得函数作为first class object传来传
去才叫函数式编程,那当然需要支持first class function。但是如果我说函数式编程
就是没有mutable变量也没有循环的程序,那么只要有递归就可以函数式编程。

【在 l*******t 的大作中提到】
: 这个显然不是。要能支持first class function,就是可以传递函数做参数
:
: 。不
: 就好
: 一个

l*******t
发帖数: 1430
26
理论上是可以的,就是无比麻烦,好比把fp编译成cpp

【在 C*****l 的大作中提到】
: 不是个事,c++就拿class当function就行了
T********2
发帖数: 1
27
对。lazy,这就是对list的一种特殊处理。也可以,这个不争论了,我们知道这里有啥
就行了。

【在 l*******t 的大作中提到】
: 就是无限递归啊。所有fp都是缺省lazy的,你写出无限递归的函数但正常情况不会无限
: 递归,比如你写个无限加一的函数,你可能就是用在zip里加个index,数据递归结束无
: 限递归也跟着结束后面的操作都没进行
:
: 行。

l*******t
发帖数: 1430
28
没有函数传递就不是函数式编程了,比如map()

【在 T********2 的大作中提到】
: 嗯,那要看你怎么定义函数式编程了。你如果非得函数作为first class object传来传
: 去才叫函数式编程,那当然需要支持first class function。但是如果我说函数式编程
: 就是没有mutable变量也没有循环的程序,那么只要有递归就可以函数式编程。

T********2
发帖数: 1
29
嗯,对。又想了一下。你说的对。
我函数式编程的简练性的确是来自于高阶函数,也就是函数可以take a function as a
parameter.

【在 l*******t 的大作中提到】
: 这个显然不是。要能支持first class function,就是可以传递函数做参数
:
: 。不
: 就好
: 一个

b***y
发帖数: 14281
30
废话,当然所有循环都能用递归实现。我理解楼主想说的是在不是用递归的情况下不能
有mutable和不能有循环是等价的条件。我指出他推理方法有漏洞。

★ 发自iPhone App: ChinaWeb 1.1.5

【在 g***n 的大作中提到】
: 艹,这用递归不也很轻松吗。
: 还神码函数式编程,笑死了,那叫功能式编程好吧
:
:
: 不正确。即使步数是确定的一样必须有循环。比如写个函数从一加到N,N是函数
: 的参数
:
: 。函数内部看步数已经确定,但不循环不行。当然用递归也行。
:
: ★ 发自iPhone App: ChinaWeb 1.1.5
:

b***y
发帖数: 14281
31
这说明你的推理不严谨。你的推理依赖于“步数确定”这个条件,但何谓步数确定?如
果是全局范围内都确定,那这个条件太强了,等于说函数完全可以不用,定义函数完全
是多余。如果只是在函数内部确定,但可以依赖于参数变量,那这就是个反例,虽然你
的设想可能是对的,但论证方法有问题。

★ 发自iPhone App: ChinaWeb 1.1.5

【在 T********2 的大作中提到】
: 我觉得这个有点儿玩赖了,参数N不确定,它还是应该算不固定次数。
T********2
发帖数: 1
32
对。这就是我想说的。
函数式编程,没有循环,和没有mutable变量,本质上是同一个要求。
后来我口滑,又说只要有递归的语言就可以函数式编程。
其实函数式编程的两大特点我是清楚的:
1. 只用递归,不用循环和mutable变量。
2. 用高阶函数,也就是function as first class citizen.
。。。
3. 还可以加上list processing。。。可能又口滑了。

【在 b***y 的大作中提到】
: 废话,当然所有循环都能用递归实现。我理解楼主想说的是在不是用递归的情况下不能
: 有mutable和不能有循环是等价的条件。我指出他推理方法有漏洞。
:
: ★ 发自iPhone App: ChinaWeb 1.1.5

T********2
发帖数: 1
33
我说步数确定是指,比如从1加到10。
可以:
sum = 0
for i in range(1, 11):
sum = sum + i
也可以:
sum = 0
sum = sum + 1
sum = sum + 2
sum = sum + 3
sum = sum + 4
sum = sum + 5
sum = sum + 6
sum = sum + 7
sum = sum + 8
sum = sum + 9
sum = sum + 10
这样的话,sum这个mutable变量也不需要了:
sum = 0
sum1 = sum + 1
sum2 = sum1 + 2
sum3 = sum2 + 3
sum4 = sum3 + 4
sum5 = sum4 + 5
sum6 = sum5 + 6
sum7 = sum6 + 7
sum8 = sum7 + 8
sum9 = sum8 + 9
sum10 = sum9 + 10
你说的也有道理。可能是表达的问题。

【在 b***y 的大作中提到】
: 这说明你的推理不严谨。你的推理依赖于“步数确定”这个条件,但何谓步数确定?如
: 果是全局范围内都确定,那这个条件太强了,等于说函数完全可以不用,定义函数完全
: 是多余。如果只是在函数内部确定,但可以依赖于参数变量,那这就是个反例,虽然你
: 的设想可能是对的,但论证方法有问题。
:
: ★ 发自iPhone App: ChinaWeb 1.1.5

r********n
发帖数: 7441
34
这就是只考虑逻辑不考虑堆栈大小
递归在数学证明上很强大,但是生产程序里面一般应该避免,可读性差而且有溢出风险

【在 i*****9 的大作中提到】
: 用递归实现循环难道不是函数编程101?
a*****V
发帖数: 1
35
数学归纳法不就是这意思吗?
T********2
发帖数: 1
36
递归就是数学归纳法。

【在 a*****V 的大作中提到】
: 数学归纳法不就是这意思吗?
1 (共1页)
进入Military版参与讨论