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 | |
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 | |
T********2 发帖数: 1 | 36 递归就是数学归纳法。
【在 a*****V 的大作中提到】 : 数学归纳法不就是这意思吗?
|