+
 新版
2016-09-26 15:36
@kchr 省了我打了很多字表达同样的观点,说了很多我想说而没有时间说的话和思想。
2016-09-26 15:35
@kchr 必须粉你啊!
2016-09-26 14:53
array_walk相当于foreach:
$arr = ['Client'=>'jQuery','Server'=>'PHP'];
array_walk($arr, function($v, $k) {
  echo "键:$k 值:$v\n";
});
比如去除数组$arr元素的前后空白:
array_walk($arr, function(&$v) { $v = trim($v); });
foreach($arr as &$v) { $v = trim($v); }

array_filter: 用回调函数过滤数组中的单元,返回过滤后的数组
var_export(
  array_filter([1, 2, 3], function($v) {
    return $v > 1;
  })
);

foreach([1, 2, 3] as $k => $v) {
  if($v > 1) {
    $tmp[$k] = $v;
  }
}
var_export($tmp);
都输出:
array (
1 => 2,
2 => 3,
)
2016-09-26 14:51
PHP array_walk/array_filter/array_map/array_reduce这些逻辑都可以用foreach来表达.

array_map: 将回调函数作用到给定数组的单元上
var_export(
  array_map(function ($v) {
    return $v * $v;
  }, [1, 2, 3])
);

foreach([1, 2, 3] as $v) {
  $tmp[] = $v * $v;
}
var_export($tmp);
都输出:
array (
0 => 1,
1 => 4,
2 => 9,
)

array_reduce: 用回调函数迭代地将数组简化(reduce)为单一的值
//输出16,即10+1+2+3,其中10作为初始值.
echo array_reduce([1, 2, 3], function($result, $item) {
  $result = $result + $item;
  return $result;
}, 10);
用foreach表达:
$result = 10;
foreach([1, 2, 3] as $v) {
  $result = $result + $v;
}
echo $result;

2016-09-26 09:53

引用来自“crab2313”的评论

楼上几位的评论就跟“只学c的说oop没有任何鸟用就是层语法”这个说法如出一辙

引用来自“kchr”的评论

不是。

只是说函数式编程主要是设计给逻辑学家,研究计算的完备性等各种数学概念用的,各种特性有利于数学推理,不利于工程中使用。

可以学来玩玩,但不要被那些扯淡的 currying / monad 唬住,这东西并不那么高大上。

纯函数,无论用什么语言的人每天都在写。需要用纯函数就写成纯的,不需要就用不纯的。全纯的系统,没什么鸟用。
CPU 就是有状态的,你用不用?硬盘和内存都是保存状态的,没有硬盘和内存的电脑,你要嘛?

不变性在现实世界根本不存在,这是物理的基本原理。太阳的位置不变?人的年龄不变?严格追求不变性的语言,根本无法描述现实世界。

惰性求值,让你的程序充满不确定性,如果一个变量惰性求值需要 30 秒,这样的东西能用嘛?

Currying 和 monad 是在解决函数式编程的特有问题,它那是腿瘸所以需要这玩艺,不瘸的人就算了。

并行,map, reduce 并不是函数式编程特有的。

用函数式编程开发并行程序,唯一比其它语言有利的地方,就是它确实强制去掉了循环、状态这些 “不利于并行的东西(但对程序是必不可少!)”。

那是,不管晴雨强制你每天带伞,即使你是住沙漠养骆驼的,当然淋不着。

引用来自“乌龟壳”的评论

Lisp Machine又是啥?

cpu之所以“有状态”是因为不是使用lambda理论设计的,而是冯诺伊曼体系设计的。至于谁好谁不好没研究,不知道。

引用来自“kchr”的评论

我绝对支持在 Lisp Machine 上工作的人去玩符号逻辑。

总之,函数式编程最初的目的,是运行在逻辑学家头脑里的一台有无限时间的 0 耗能理想机器上的,无限长纸带的图灵机啥的。模型要简单和基本,方便在大脑中运行,至于运行个 "Hello World" 就需要 1 亿年,那倒不是什么缺点。

很多关于关于函数式编程的优点的说法,基本都是扯淡。

至于并行,发掘待解决问题中并行性,主要取决于问题本身的性质,和函数式编程无关。

在我看来,函数式编程唯一的优点,就是强制程序员从一开始就发掘并行性 -- 即使在不需要它并行的地方。由于函数式程序非常缓慢,真要靠它并行的时候,又比用 C++ 搭配 TBB 写的并行程序慢很多 -- 那我要你还有鸟用?!
你说的慢可有证据?王垠说lisp以前慢是编译器的问题,现在很快了。

我只是个搬运工~~~
2016-09-26 09:33

引用来自“crab2313”的评论

楼上几位的评论就跟“只学c的说oop没有任何鸟用就是层语法”这个说法如出一辙

引用来自“kchr”的评论

不是。

只是说函数式编程主要是设计给逻辑学家,研究计算的完备性等各种数学概念用的,各种特性有利于数学推理,不利于工程中使用。

可以学来玩玩,但不要被那些扯淡的 currying / monad 唬住,这东西并不那么高大上。

纯函数,无论用什么语言的人每天都在写。需要用纯函数就写成纯的,不需要就用不纯的。全纯的系统,没什么鸟用。
CPU 就是有状态的,你用不用?硬盘和内存都是保存状态的,没有硬盘和内存的电脑,你要嘛?

不变性在现实世界根本不存在,这是物理的基本原理。太阳的位置不变?人的年龄不变?严格追求不变性的语言,根本无法描述现实世界。

惰性求值,让你的程序充满不确定性,如果一个变量惰性求值需要 30 秒,这样的东西能用嘛?

Currying 和 monad 是在解决函数式编程的特有问题,它那是腿瘸所以需要这玩艺,不瘸的人就算了。

并行,map, reduce 并不是函数式编程特有的。

用函数式编程开发并行程序,唯一比其它语言有利的地方,就是它确实强制去掉了循环、状态这些 “不利于并行的东西(但对程序是必不可少!)”。

那是,不管晴雨强制你每天带伞,即使你是住沙漠养骆驼的,当然淋不着。
Lisp Machine又是啥?

cpu之所以“有状态”是因为不是使用lambda理论设计的,而是冯诺伊曼体系设计的。至于谁好谁不好没研究,不知道。
2016-09-26 06:00
楼上几位的评论就跟“只学c的说oop没有任何鸟用就是层语法”这个说法如出一辙
2016-09-24 16:43
@kchr

其实代码就是信息,不管面向对象还是过程式还是函数式,在我眼里只关心能不能不要给我使绊子的前提下,让我清晰地把需要的逻辑记录下来,并能自动检查错误,自动生成最终需要运行的程序,就足够了。

动态语言如Python/PHP在自动错误检查方面不够方便
以前的java过于面向对象,在表达一些嵌套逻辑的时候不够方便,现在还行
函数式接触得不多,看了下schema的一些程序片段,基本能一眼看懂程序逻辑,应该还行吧。

我说这么多其实想表达的是,这没啥大惊小怪的,只不过是语法而已,再完美的语法也抵不住很少方便的库。
2016-09-24 11:51

引用来自“kchr”的评论

还有,那他妈的是“代码简洁”吗?那是语言内置了库好不好。

我还可以一行代码向网站发一条 url,就获取图像识别结果呢。
+1
2016-09-24 11:43
程序员是最爱折腾的一群人!
2016-09-24 10:52
喜爱面向对象技术的人,还是不应固步自封,还是应该跳出面向对象编程的圈子,去了解和接触函数式编程。
看到自己不识得的东西,不去了解就狂喷是不可取的,只会暴露智商。
回复 @
{{emojiItem.symbol}}
返回顶部
顶部