F#编程:命令式编程与类型理解
1. 命令式编程中的副作用
在编程过程中,副作用是一个需要关注的重要概念。副作用可以分为弱副作用和强副作用。
1.1 弱副作用
从磁盘读取文件可以被视为一种弱副作用。磁盘可以看作是只读内存的扩展,因此读取这些文件对程序的影响相对较小,在程序中融入这种操作并不困难。
1.2 强副作用
强副作用对程序的正确性和操作特性具有更严重的腐蚀作用。例如,阻塞网络I/O就是一种相对较强的副作用。在库例程中执行阻塞网络I/O可能会破坏GUI应用程序的响应性,尤其是当该例程由应用程序的GUI线程调用时。此外,任何执行线程间同步的构造也是强副作用的主要来源。
副作用的强弱取决于应用程序以及副作用的后果是否与其他实体充分隔离。在应用程序的外壳或使用F# Interactive进行脚本编写时,可以自由使用强副作用;否则,可能无法实现预期效果。
当编写较大的代码块时,应尽量使大部分代码不使用强副作用,或者至少在使用时明确指出。线程和并发通常用于解决与强副作用相关的问题。
1.3 避免命令式编程与惰性求值的结合
一般认为,将延迟计算(即惰性求值)与副作用结合使用是一种不良的编程风格。虽然并非完全如此,例如使用序列将文件系统读取设置为惰性计算是合理的,但这种编程方式很容易出错。
以下是一个错误的示例:
open System.IO
let reader1, reader2 =
let reader = new StreamReader(Fi
超级会员免费看
订阅专栏 解锁全文
5万+

被折叠的 条评论
为什么被折叠?



