今天看Haskell教程时读到函数不应有副作用,但有时候我只想写一个纯粹的过程啊!
语言性质决定的,C语言更重要的作用是对底层硬件的直接操作(作为基础语言被用于几乎所有嵌入式平台)。因此函数几乎必须要有“副作用”,例如大量的系统API都是传递指针而不是传递值,目的就是为了直接向内存中读写结果(以减少内存复制开销)。
@ctmakro 我觉得你答非所问。
人家不是回答了你的疑问了?
越接近底层的语言,对内存的操作自然也就越自由。
命令式语言赋值操作(=)本质上是对内存的直接操作,赋值完成后等号右边对应的内存就被改变为等号左边的值,这个值不管是值本身还是值的指针,都对应着内存的改变。
函数式语言的等号则不是赋值操作,等号只是一种定义,定义了干什么,这个干什么在没有真正运行之前都不会实际运算,也即对内存是没有操作的,这个特性就构成了没有副作用的纯函数的基础。但有这个基础,并不代表函数式语言里所有函数都是纯的,一些跟系统相关的函数是不纯的。函数式语言本身都要妥协,一个跟底层打交道的语言为了性能,做一些妥协有什么不妥?
希望你能把haskell,erlang什么的玩得很溜,我资质愚炖,只能掌握命令式语言的皮毛,函数式的确很美好,但我还得面对自己智商不足的现实。
按照你的逻辑,所有命令式语言都是错的,包括javascript,java,c++,lua,c#,PHP等等等等等。。。。。。。
C语言是人家写操作系统时方便自己用搞出来的,想的可能不是啥过程或者函数之类的概念吧,属于实战派的典范……