w***g 发帖数: 5958 | 1 所谓的纯函数式程序只能运行于编译期, 其计算结果是一段可以与现实世界I/O的程序.
从这一点来说, C++的模板元语言是真正的纯函数式编程. 你们要学函数式编程, 那些
小语种要我说都不靠谱, 因为学了也没什么地方用. 要我说用C++做函数式编程有下面
几个好处:
1. abstraction overhead极低, 编译出来的程序性能非常高.
2. 同时有函数型和命令型两种编程模式, 可以按任务的需要选择合适的模式. Haskell
语言本身是纯函数的, 为了进行I/O搞出了monad这种怪胎. 但是要是去看用Haskell语
言写的程序, 大部分看起来还是命令型的. 用C++则无需这么迂腐.
3. 学了东西可以直接在工作中用.
4. 虽然模板语言本身写起来比较冗长, 但产生的库却非常优美. 比如用来做parsing的
boost::spirit, 丝毫不逊于haskell的parsec.
要说C++能毫无争议地超越java的, 怕也只有函数式编程这一块了. | w***g 发帖数: 5958 | 2 这版上的人平均水平太低, 估计也没什么人能理解我, 还以为我在说胡话呢.
序.
Haskell
【在 w***g 的大作中提到】 : 所谓的纯函数式程序只能运行于编译期, 其计算结果是一段可以与现实世界I/O的程序. : 从这一点来说, C++的模板元语言是真正的纯函数式编程. 你们要学函数式编程, 那些 : 小语种要我说都不靠谱, 因为学了也没什么地方用. 要我说用C++做函数式编程有下面 : 几个好处: : 1. abstraction overhead极低, 编译出来的程序性能非常高. : 2. 同时有函数型和命令型两种编程模式, 可以按任务的需要选择合适的模式. Haskell : 语言本身是纯函数的, 为了进行I/O搞出了monad这种怪胎. 但是要是去看用Haskell语 : 言写的程序, 大部分看起来还是命令型的. 用C++则无需这么迂腐. : 3. 学了东西可以直接在工作中用. : 4. 虽然模板语言本身写起来比较冗长, 但产生的库却非常优美. 比如用来做parsing的
| d***q 发帖数: 1119 | 3 template 在c++是图灵完备的,利用编译期间 确实可以搞出很多花样。
不过 这样搞有两个问题
1:是编译比较慢
2:debug麻烦,如果用到模板的地方,编译器报告的错误比较晦涩,不大容易定位。
如果只用c++写应用而不是写库的话,模板并不是必用的东西。 | n*w 发帖数: 3393 | 4 Not willing to respond the original post after read the monad part.
agree especially 2. a real headache
【在 d***q 的大作中提到】 : template 在c++是图灵完备的,利用编译期间 确实可以搞出很多花样。 : 不过 这样搞有两个问题 : 1:是编译比较慢 : 2:debug麻烦,如果用到模板的地方,编译器报告的错误比较晦涩,不大容易定位。 : 如果只用c++写应用而不是写库的话,模板并不是必用的东西。
| r*g 发帖数: 3159 | 5 我在stackoverflow曾经问C++模板元语言是不是函数式编程,结果被人vote给关掉了。
序.
Haskell
【在 w***g 的大作中提到】 : 所谓的纯函数式程序只能运行于编译期, 其计算结果是一段可以与现实世界I/O的程序. : 从这一点来说, C++的模板元语言是真正的纯函数式编程. 你们要学函数式编程, 那些 : 小语种要我说都不靠谱, 因为学了也没什么地方用. 要我说用C++做函数式编程有下面 : 几个好处: : 1. abstraction overhead极低, 编译出来的程序性能非常高. : 2. 同时有函数型和命令型两种编程模式, 可以按任务的需要选择合适的模式. Haskell : 语言本身是纯函数的, 为了进行I/O搞出了monad这种怪胎. 但是要是去看用Haskell语 : 言写的程序, 大部分看起来还是命令型的. 用C++则无需这么迂腐. : 3. 学了东西可以直接在工作中用. : 4. 虽然模板语言本身写起来比较冗长, 但产生的库却非常优美. 比如用来做parsing的
| a*****e 发帖数: 1700 | 6 你混淆了几个概念。元编程 (Meta programming) 和函数编程 (Functional
Programming),还有静态编译的优化 (static compilation optimization) 这三者是
orthogonal 的概念,不能混为一谈。
纯函数编程一样需要输入(参数值)和输出(返回值),你把这些和 I/O 搞混了。所
谓 I/O 的输入和输出是特指有副作用的,即便将一个程序的 I/O 部分和纯函数部分划
分开来,也不表示纯函数部分能够在编译期静态执行。在编译期,如果参数仅是变量而
非确定的值的话,即便是纯函数程序也无法运行。所以“所谓的纯函数式程序只能运行
于编译期”这句话是不正确的。
如果你要说的是编译期对纯函数的程序做优化比较容易,这个确实是这样,也算是函数
语言的一个小优势。
运用模板元编程在编译期也可以完成很多事情,但这不能和函数编程混为一谈。元编程
的直观理解是生成程序的程序,所以可以利用元编程在静态编译期做一些优化工作,或
者对一些抽象的模板进行展开,但是它并不能取代函数编程本身。比如 Ocaml 和
Haskell 里面同样有模板元编程的工具,它们和所有能在静态编译期使用的工具一样,
不适用于缺乏输入值的情况。
如果感兴趣,你也可以接触一下 partial evaluation,对什么能够静态执行和什么必
须动态执行,能够有更清晰的认识。
序.
Haskell
【在 w***g 的大作中提到】 : 所谓的纯函数式程序只能运行于编译期, 其计算结果是一段可以与现实世界I/O的程序. : 从这一点来说, C++的模板元语言是真正的纯函数式编程. 你们要学函数式编程, 那些 : 小语种要我说都不靠谱, 因为学了也没什么地方用. 要我说用C++做函数式编程有下面 : 几个好处: : 1. abstraction overhead极低, 编译出来的程序性能非常高. : 2. 同时有函数型和命令型两种编程模式, 可以按任务的需要选择合适的模式. Haskell : 语言本身是纯函数的, 为了进行I/O搞出了monad这种怪胎. 但是要是去看用Haskell语 : 言写的程序, 大部分看起来还是命令型的. 用C++则无需这么迂腐. : 3. 学了东西可以直接在工作中用. : 4. 虽然模板语言本身写起来比较冗长, 但产生的库却非常优美. 比如用来做parsing的
| d**********x 发帖数: 4083 | 7 一般来说,C++还是相当依赖OO这个paradigm的
template虽好,但是如果不能为可维护性工作,用途就只能局限于制作程序库。
modern c++ design 给出了一个相当光明的方向,但是我不知道有多少人能掌握这些技
术并且应用到产品中。。。
是
【在 a*****e 的大作中提到】 : 你混淆了几个概念。元编程 (Meta programming) 和函数编程 (Functional : Programming),还有静态编译的优化 (static compilation optimization) 这三者是 : orthogonal 的概念,不能混为一谈。 : 纯函数编程一样需要输入(参数值)和输出(返回值),你把这些和 I/O 搞混了。所 : 谓 I/O 的输入和输出是特指有副作用的,即便将一个程序的 I/O 部分和纯函数部分划 : 分开来,也不表示纯函数部分能够在编译期静态执行。在编译期,如果参数仅是变量而 : 非确定的值的话,即便是纯函数程序也无法运行。所以“所谓的纯函数式程序只能运行 : 于编译期”这句话是不正确的。 : 如果你要说的是编译期对纯函数的程序做优化比较容易,这个确实是这样,也算是函数 : 语言的一个小优势。
| r*********r 发帖数: 3195 | 8 用 concept
【在 d***q 的大作中提到】 : template 在c++是图灵完备的,利用编译期间 确实可以搞出很多花样。 : 不过 这样搞有两个问题 : 1:是编译比较慢 : 2:debug麻烦,如果用到模板的地方,编译器报告的错误比较晦涩,不大容易定位。 : 如果只用c++写应用而不是写库的话,模板并不是必用的东西。
| d**********x 发帖数: 4083 | 9 不是被标准委员会日了么
【在 r*********r 的大作中提到】 : 用 concept
| r*g 发帖数: 3159 | 10 元编程 (Meta programming) 和函数编程 (Functional Programming) 不是正交的概念。
底下这个连接讲的清楚:
http://bannalia.blogspot.com/2008/05/functional-characterizatio
。。。
So, C++ template metaprogramming can be regarded as a pure, non-strict,
untyped functional language with pattern matching.
是
【在 a*****e 的大作中提到】 : 你混淆了几个概念。元编程 (Meta programming) 和函数编程 (Functional : Programming),还有静态编译的优化 (static compilation optimization) 这三者是 : orthogonal 的概念,不能混为一谈。 : 纯函数编程一样需要输入(参数值)和输出(返回值),你把这些和 I/O 搞混了。所 : 谓 I/O 的输入和输出是特指有副作用的,即便将一个程序的 I/O 部分和纯函数部分划 : 分开来,也不表示纯函数部分能够在编译期静态执行。在编译期,如果参数仅是变量而 : 非确定的值的话,即便是纯函数程序也无法运行。所以“所谓的纯函数式程序只能运行 : 于编译期”这句话是不正确的。 : 如果你要说的是编译期对纯函数的程序做优化比较容易,这个确实是这样,也算是函数 : 语言的一个小优势。
| r*********r 发帖数: 3195 | 11 with concept, c++ template is actually typed functional
【在 r*g 的大作中提到】 : 元编程 (Meta programming) 和函数编程 (Functional Programming) 不是正交的概念。 : 底下这个连接讲的清楚: : http://bannalia.blogspot.com/2008/05/functional-characterizatio : 。。。 : So, C++ template metaprogramming can be regarded as a pure, non-strict, : untyped functional language with pattern matching. : : 是
| a*****e 发帖数: 1700 | 12 对。元编程可以有函数语言的特性,但不代表可以取而代之,毕竟它只是编译期的工具。
念。
【在 r*g 的大作中提到】 : 元编程 (Meta programming) 和函数编程 (Functional Programming) 不是正交的概念。 : 底下这个连接讲的清楚: : http://bannalia.blogspot.com/2008/05/functional-characterizatio : 。。。 : So, C++ template metaprogramming can be regarded as a pure, non-strict, : untyped functional language with pattern matching. : : 是
| d***q 发帖数: 1119 | 13 如果用来写库,是个不错的选择。一般人不写库不用它也没啥大不了的。
几年前有个一段时期比较喜欢template,总觉得不用就不爽,硬套用了几个,现在发现
没必要这样较劲,如果用得不舒服,不要用就是了。
【在 d**********x 的大作中提到】 : 一般来说,C++还是相当依赖OO这个paradigm的 : template虽好,但是如果不能为可维护性工作,用途就只能局限于制作程序库。 : modern c++ design 给出了一个相当光明的方向,但是我不知道有多少人能掌握这些技 : 术并且应用到产品中。。。 : : 是
|
|