z****e 发帖数: 54598 | 1 immutable讲的是func之间要immutable
内部无所谓,完全可以不控制
所以有个scope的问题
但是为什么func的参数需要immutable呢?
fp的zealot没有一个说得清楚的
都是各种大概念满天飞
甚至否定数学上变量存在的意义
为了自圆其说,笑死了
估计他们自己也都没有真的弄明白为什么要这样
fp只是很多人的一个虎皮而已
一旦撕下这个虎皮,你会发现
其实他根本就不明白为什么要用fp
这就是杀人游戏,你不说我什么都看不出来
你说得越多,破绽越多,就越能看明白你到底是不是懂 |
l******t 发帖数: 55733 | 2 因为lambda里没有变量的位置啊。
你要想吧lambda写的像有变量很容易的。haskell的let,where够你用的。scala直接可
以定义val。当然,let,where的本质还是声明了一个匿名lambda传参。
你要想定义状态,那更完全没问题。用FP定义状态保证比你在过程里声明一堆var好用
维护的多。
如果你非要z=x; x=y;y=z;来做swap,没for(int i =0;)就不会写了。那还是别用fp了
, |
z****e 发帖数: 54598 | 3 mutable var的存在会使得func变得不确定
这是唯一的原因
func的确定性会受到冲击
在多线程环境下就不安全了
这个其实对于随便一个语言来说都可以直接用
无论是不是fp,说这个东西跟fp不fp没关系
【在 l******t 的大作中提到】 : 因为lambda里没有变量的位置啊。 : 你要想吧lambda写的像有变量很容易的。haskell的let,where够你用的。scala直接可 : 以定义val。当然,let,where的本质还是声明了一个匿名lambda传参。 : 你要想定义状态,那更完全没问题。用FP定义状态保证比你在过程里声明一堆var好用 : 维护的多。 : 如果你非要z=x; x=y;y=z;来做swap,没for(int i =0;)就不会写了。那还是别用fp了 : ,
|
p*****2 发帖数: 21240 | 4
我就说了,学习的是思想,大牛你还不同意。FP的思想可以用于OO。
【在 z****e 的大作中提到】 : immutable讲的是func之间要immutable : 内部无所谓,完全可以不控制 : 所以有个scope的问题 : 但是为什么func的参数需要immutable呢? : fp的zealot没有一个说得清楚的 : 都是各种大概念满天飞 : 甚至否定数学上变量存在的意义 : 为了自圆其说,笑死了 : 估计他们自己也都没有真的弄明白为什么要这样 : fp只是很多人的一个虎皮而已
|
z****e 发帖数: 54598 | 5 好吧,当我把它肢解了之后,发现可以逐个吸收
【在 p*****2 的大作中提到】 : : 我就说了,学习的是思想,大牛你还不同意。FP的思想可以用于OO。
|
p*****2 发帖数: 21240 | 6
没错。什么纯了都不好。
【在 z****e 的大作中提到】 : 好吧,当我把它肢解了之后,发现可以逐个吸收
|
d*******r 发帖数: 3299 | 7 记得以前王垠blog上讨论过这个
=================================================
http://www.douban.com/note/269210328/
其实要达到纯函数式语言的这种“纯”的效果,你根本不需要使用像 Haskell 这样完
全排斥“赋值语句”的语言。你甚至不需要使用 Lisp 这样的“非纯”函数式语言。你
完全可以用 C 语言,甚至汇编语言,达到同样的效果。
我只举一个非常简单的例子,如果你在 C 语言里面定义如下的“函数”。虽然函数体
里面含有赋值语句,它却是一个真正意义上的“纯函数”:
int f (int x) {
int y, z;
y = 2 * x;
z = y + 1;
y = z / 3;
return y;
}
这是为什么呢?因为它计算的是数学函数 (2x+1)/3 。你给它同样的输入,肯定会得到
同样的输出。函数里虽然对 y 和 z 进行了赋值,但这种赋值都是“局部”的,它不会
在函数里留下“状态”。所以这个函数虽然使用了被“纯函数程序员”们唾弃的“赋值
语句”,它仍然完全的符合“纯函数”的定义。
=================================================
【在 z****e 的大作中提到】 : immutable讲的是func之间要immutable : 内部无所谓,完全可以不控制 : 所以有个scope的问题 : 但是为什么func的参数需要immutable呢? : fp的zealot没有一个说得清楚的 : 都是各种大概念满天飞 : 甚至否定数学上变量存在的意义 : 为了自圆其说,笑死了 : 估计他们自己也都没有真的弄明白为什么要这样 : fp只是很多人的一个虎皮而已
|
p*****2 发帖数: 21240 | 8
这么说就SB了。
【在 d*******r 的大作中提到】 : 记得以前王垠blog上讨论过这个 : ================================================= : http://www.douban.com/note/269210328/ : 其实要达到纯函数式语言的这种“纯”的效果,你根本不需要使用像 Haskell 这样完 : 全排斥“赋值语句”的语言。你甚至不需要使用 Lisp 这样的“非纯”函数式语言。你 : 完全可以用 C 语言,甚至汇编语言,达到同样的效果。 : 我只举一个非常简单的例子,如果你在 C 语言里面定义如下的“函数”。虽然函数体 : 里面含有赋值语句,它却是一个真正意义上的“纯函数”: : int f (int x) { : int y, z;
|
l*y 发帖数: 21010 | 9 这么说一点都不sb
【在 p*****2 的大作中提到】 : : 这么说就SB了。
|
p*****2 发帖数: 21240 | 10
他这个不能保证纯。
【在 l*y 的大作中提到】 : 这么说一点都不sb
|
|
|
l*y 发帖数: 21010 | 11 用local ariable就是纯的
【在 p*****2 的大作中提到】 : : 他这个不能保证纯。
|
p*****2 发帖数: 21240 | 12
用local就纯?
FP是一种更高级的编程技术,C这么底层的根本不可能做到FP。
【在 l*y 的大作中提到】 : 用local ariable就是纯的
|
b********0 发帖数: 62 | 13 可是他说的是 达到pure的效果 也就是相同的输入一定能得到相同的输出..
【在 p*****2 的大作中提到】 : : 用local就纯? : FP是一种更高级的编程技术,C这么底层的根本不可能做到FP。
|
l*y 发帖数: 21010 | 14 只是用c达到fp的一个方面
【在 p*****2 的大作中提到】 : : 用local就纯? : FP是一种更高级的编程技术,C这么底层的根本不可能做到FP。
|
N******K 发帖数: 10202 | 15 swap 不用临时变量 怎么实现?
杂技演员 两个手里的东西 往天上一扔 然后互相换位置?
就算这样 这个“天”就是临时存储空间
【在 l******t 的大作中提到】 : 因为lambda里没有变量的位置啊。 : 你要想吧lambda写的像有变量很容易的。haskell的let,where够你用的。scala直接可 : 以定义val。当然,let,where的本质还是声明了一个匿名lambda传参。 : 你要想定义状态,那更完全没问题。用FP定义状态保证比你在过程里声明一堆var好用 : 维护的多。 : 如果你非要z=x; x=y;y=z;来做swap,没for(int i =0;)就不会写了。那还是别用fp了 : ,
|
c******o 发帖数: 1277 | 16 没有mutable,为什么要swap?
有其他的方法做类似的事
【在 N******K 的大作中提到】 : swap 不用临时变量 怎么实现? : 杂技演员 两个手里的东西 往天上一扔 然后互相换位置? : 就算这样 这个“天”就是临时存储空间
|
a*****e 发帖数: 1700 | 17 这个例子只能说明 mutable by default 需要遵守一定规则 (使用 non-escaping 局部
变量)才能安全,想用它来例证 mutable by default 好?逻辑上讲不通。
为什么我说 non-escaping,因为如果使用 closure 捕捉局部变量成为环境变量,就
escape 了它们原先的定义域,mutation 会导致意想不到的状况,和使用全局 mutable
变量类似。
【在 l*y 的大作中提到】 : 这么说一点都不sb
|
n*w 发帖数: 3393 | 18 如果要把tuple位置换一下,
let swap (a, b) = (b, a)
【在 N******K 的大作中提到】 : swap 不用临时变量 怎么实现? : 杂技演员 两个手里的东西 往天上一扔 然后互相换位置? : 就算这样 这个“天”就是临时存储空间
|
h*i 发帖数: 3446 | 19 这是明显的吧。FP语言也是在IP机器上实现的。但是,能用IP语言实现不说明FP语言就
不需要了,就如不能说机器语言能干高级语言的一切所以不需要高级语言一样。
★ 发自iPhone App: ChineseWeb 8.7
【在 d*******r 的大作中提到】 : 记得以前王垠blog上讨论过这个 : ================================================= : http://www.douban.com/note/269210328/ : 其实要达到纯函数式语言的这种“纯”的效果,你根本不需要使用像 Haskell 这样完 : 全排斥“赋值语句”的语言。你甚至不需要使用 Lisp 这样的“非纯”函数式语言。你 : 完全可以用 C 语言,甚至汇编语言,达到同样的效果。 : 我只举一个非常简单的例子,如果你在 C 语言里面定义如下的“函数”。虽然函数体 : 里面含有赋值语句,它却是一个真正意义上的“纯函数”: : int f (int x) { : int y, z;
|
z****e 发帖数: 54598 | 20 热
【在 c******o 的大作中提到】 : 没有mutable,为什么要swap? : 有其他的方法做类似的事
|
|
|
h*i 发帖数: 3446 | 21 Right on
★ 发自iPhone App: ChineseWeb 8.7
【在 c******o 的大作中提到】 : 没有mutable,为什么要swap? : 有其他的方法做类似的事
|
z****e 发帖数: 54598 | 22 极少情况会escape出来
java的反射也做不到
反射可以抓出private member
但是local var还是不行
只有提供debug模式的jvm
会让外界看到这个var的val是啥
这么做仅仅是为了给ide提供方便
但是原则上也不允许修改
mutable
【在 a*****e 的大作中提到】 : 这个例子只能说明 mutable by default 需要遵守一定规则 (使用 non-escaping 局部 : 变量)才能安全,想用它来例证 mutable by default 好?逻辑上讲不通。 : 为什么我说 non-escaping,因为如果使用 closure 捕捉局部变量成为环境变量,就 : escape 了它们原先的定义域,mutation 会导致意想不到的状况,和使用全局 mutable : 变量类似。
|
x*h 发帖数: 72 | |
l**********n 发帖数: 8443 | 24 变量有两种解释:
1)associative binding between a name and an expression
2) memory location
第一种是小学就学会了 |
q*c 发帖数: 9453 | 25 int X = 2
int Y = 3
X = X xor y
Y= X xor y
X = X xor y
经典面试题, 当年一个 principle 面试我,要我交换两个变量(用无脑的方法)。
这样的羞辱哥怎么能接收?马上就用这个把他跪了。
【在 N******K 的大作中提到】 : swap 不用临时变量 怎么实现? : 杂技演员 两个手里的东西 往天上一扔 然后互相换位置? : 就算这样 这个“天”就是临时存储空间
|