怎么理解函数式编程中的"变量也是函数"

2014-04-15 14:09:36 +08:00
 pythonee
在大多数函数式编程语言中,大多数都强调一切都是函数,函数式一等公民。
那么 "变量" 也是 "函数"

var foo = "hello world"

那么"foo"这个变量也是一个函数?

是不是可以说等价于下面的函数写法

def foo() = { "hello world" }

即变量名是方法名,变量值是返回值。
那么这样说的话,函数式和命令式的本质区别是什么呢?只是表示形式上的区别吗
6755 次点击
所在节点    程序员
40 条回复
min
2014-04-15 14:22:21 +08:00
函数==变量说明函数的参数和返回值也可以是函数,这点很重要
zzNucker
2014-04-15 14:26:23 +08:00
说法有问题吧,不是“变量也是函数”。
是“函数”可以赋给变量。

延伸出去就是函数可以作为返回值,可以作为参数,可以作为XXXXX。
otakustay
2014-04-15 14:27:32 +08:00
应该是“变量可以是函数”吧?
walleL
2014-04-15 14:33:21 +08:00
walleL
2014-04-15 14:34:11 +08:00
楼上各位真快 。。。
jsonline
2014-04-15 14:36:29 +08:00
没听说过这句话
ibudao
2014-04-15 14:37:28 +08:00
有点意思,不过我觉得本质是:数据即代码,代码即数据。所谓代码,就是可以被执行的,或者说加上了可eval的标记,但其实也是一种数据。
变量实际上是一种标识符,函数名也是一种标识符,而标识符通常被解析为一个内存地址,这个内存地址可以存放数据,也可以存放代码。
命令式语言中,通常变量类型的标识符存放的是数据;而函数式语言则都可存放。
NemoAlex
2014-04-15 14:37:58 +08:00
听说过一切都是对象,没听说一切都是函数...
求出处,需要研读一下
ibudao
2014-04-15 14:40:25 +08:00
@NemoAlex 一切都是0和1...
NovemberEleven
2014-04-15 14:51:40 +08:00
就像数学,y可以是一个函数,也可以是一个数字。
zhy0216
2014-04-15 15:13:45 +08:00
常量函数
pengyang
2014-04-15 15:16:48 +08:00
学习了,谢谢
pythonee
2014-04-15 15:29:05 +08:00
@NemoAlex 出处找不到了,记得是看haskell还是lisp提到的
standin000
2014-04-15 15:44:31 +08:00
是数据也是函数。在其它语言里,数据和函数是区分的。

最直观的就是代码本身在LISP中也是可以eval的。
Kabie
2014-04-15 16:22:02 +08:00
...给成员变量设getter和setter倒是面向对象语言经常提的吧。。。
dun2
2014-04-15 16:22:23 +08:00
> 那么这样说的话,函数式和命令式的本质区别是什么呢?只是表示形式上的区别吗

严格的函数式编程强调不使用mutable的变量。
即变量一旦赋值以后就无法更改。

这样就不存在状态的争抢,利于实现并发和分布式的场景了。
plprapper
2014-04-15 16:32:15 +08:00
fordo(){
commond=$1
for i in `seq 100`
do
$commond
sleep 1s
done
}

。。。
flypiggy
2014-04-15 17:34:41 +08:00
函数式编程就没有变量....
pythonee
2014-04-15 17:41:43 +08:00
@flypiggy 是的,我也就是这个意思,变量不过是表现的像个变量,其实是个无参函数。但是这句话没有说清我那个疑问啊
simpx
2014-04-15 18:15:05 +08:00
[OT]
少年,过去我也像你这样,被一些优雅的概念吸引,尤其是“万物皆函数”、“数据即代码”这一类的大一统的概念。
但后来我刨根问底后发现,这些优雅的概念仅仅是复杂现实的一个理想性封装,比如拥有这些“特性”的语言,底层实现也是非常dirty的,真正的优雅,只能存在数学里。
这些人造概念的坏处,被你说中了,有些就是”形式上的区别“,它底层逃不开笨拙的机器
所以,不用纠结于这些人造的概念,要么多看算法,要么,多写代码。

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

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

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

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

© 2021 V2EX